본문 바로가기

콤퓨타/Programming) 왕초보 자바

37. Static

 

👉 객체마다가 아니라 클래스 전체가 공유하는 속성/기능

이라고 책지피티가 알려줌. 음

 

오타 없이 수업 듣고 콘솔 작동시키기가 끝나고 이제 또 새로운 영역으로 들어왔는데 

눈에 익숙한 코드 들이 작성되지만

한편으로는 세세한 내용들 적어놓고 선생님은 또 '참 쉽죠?' ... 

뭐쩌라는건지. 

그래서 책지피티에게 하나하나 물어보는데 이짓거리를 올해 내내 해야한다니 벌써 한숨이 팍 쉬어지고

그래도 어떻게든 좀 붙어있으려고 방법으로 바꿔봤다. 

이름하여 분석법

 

 

package application;

public class App {
	
	public static void main(String[] args) {
	
		final String CAT_FORMAT_STR= "Count of cats: %d\n"; 

		String catCount = String.format(CAT_FORMAT_STR, Cat.getCount());
		
		System.out.println(catCount);

		
		Cat cat1 = new Cat("Horace"); 
		Cat cat2 = new Cat("Matila") ; 
		Cat cat3 = new Cat("Peter"); 
		
		System.out.println(cat1);
		System.out.println(cat2);
		
		System.out.println(Cat.FOOD);
	// System.out.println(Math.PI);	
	
	// System.out.println(Cat.getCount());
	
catCount =String.format(CAT_FORMAT_STR, Cat.getCount());
		System.out.println(catCount);
	
	}

}

 

 

 

package application;

public class Cat {

	private String name;

	public static final String FOOD = "Cat food";

	static int count = 0;

	public Cat(String name) {
		this.name = name;
		count++;

	}

	public static int getCount() {
		return count;

	}

	public String toString() {
		return "Cat [name = " + name + "]";
	}

}

 

 

 

 

 

 

 

일단 코드는 보여주는데로 무지성작성 챡챠갹챡. 

그리고 챗지피티랑 분석 시작 ㄱ! 

 

 

/* 자 일단 cat.java 분석해볼게. 
private 이랑 public은 사실 아직 개념 자체가 너무 vague 하니까 그거 빼고 
그리ㅗㄱ toString도 정말 잘 모르겠으므로 그것도 빼고 하자면 잘 봐, */


package application;  //  <<--- 패키지 application에 있고 이 안에 있는 객체들, main class 사용합시데이  
public class Cat {  // <- 일단 클래스는 '캣' 입니데이 
  
	private String name;  //  <-- 문자열 쓸거고 변수 이름은 name 입니데이 
   	public static final String FOOD = "Cat food"; //  <- 이것이 아마 핵심 기능 중 하나일겁니데이. 모든 main 클래스에는 캣 3개의 객체가 만들어져있는데, 그 객체 상관없이 , 걔네들의 food라고 하면 얘가 공통적인 답변입니데이.  
	static int count = 0;  // <- 이것도 static이라서 공통입니다. 챗지피티 말로는 , 서버방문자, 로그인 한 사람 뭐저고 저쩌고 총 계를 관리하는거라고 하는데 저는 이쯤되니 궁금한게, 중복 방문자나, 서버방문하고 로그인까지 하고 그래서 찍히는 방문 은 중복 처리 되어서 방문 숫자는 1로 찍히는게 맞지요? 
 
	public Cat(String name) { //  <- 이제 문자열 'name'에 대해 이야기 해볼텐데. 이게 예전에 getter / setter 때 배운거에요. setter를... 뭐였지.. 좀 더 간단하게 만드는거였나? constructor였나? 하여간 기본 setter 모습이 있는데. this.를 쓰고부터는 기본 setter보다 훨씬 더 간소하게 , 한방에 만들수 있는 객체(?) 붕어빵 툴(?) 이었어요. 하여간 this. 바로 뒤에 쓴 name은 붕어빵 툴이고  equal 기호 뒤에 나오는 name은 불러오기 하는 name 이었던가. ㅎ 모르겠어요. 
		this.name = name; 
		count++;  // <-- 여기서 count는 왜 자꾸 나오는지 모르겠는데. 아마도 이름이 나온만큼 count 한다는 거겠죠? 이름 3번 나오면 3번 카운트  ㅇㅇ  
	}

	public static int getCount() {  //  <---- getter 입니다. 얘가 호출되면 
		return count;  //  < -- 얼마나 불려왔는지를 세어서 return 합니다. return은 하지만, 출력 요청이 나온건이 아니라면 굳이 출력은 안합니다. 세는건 다 컴퓨터가 끝단에서 혼자 계산한다 이말임. (말인 즉, 출력이 굳이 안되어도, that doesn't mean 컴터가 계산 안하고 있다. . 갑자기 멋진 결과 값이 출력되어도 놀라지 말자구요 ^,~)  
	}

	public String toString() {  // <-- 아 .. ㅌㅂ toString 정말 너무나도 이해가 안됩니다. 좌표값도 아니라고 했고. address도 아니라고 했는데. 이게 String도 아닌데 왜  String을 달고 있는지 도무지 이해가지 않음. ㄱㅅㅋ....  
		return "Cat [name = " + name + "]"; // <-- 머 위에서 toString이 뭘 하든지 간에 일단 고양이이름을 return 해주고, 아직도 이해가 안되는건, 메인 App class에는  Cat cat1 = new Cat("Horace"); 라고 객체(?) 가 만들어져있는데, 이 public String toString()이 왜 저 객체값을 return 하는건지 모르겠음. 뭐. 이것만 모르겠ㄴㅣ. 모르는게 별 일은 아니니까 그냥 일단 짜지쟈... ㅎ 
	}
}

 


이러고 아래에  책지피티 답변 붙여놓긔. 

 

 

더보기

좋다 👍
이건 진짜 제대로 분석하는 방식이다.
지금 네 설명 보면 이미 60~70% 이해는 되어 있음.
(느낌만 vague 할 뿐 구조는 거의 맞음)

하나씩 네 말 기준으로 맞는 부분 / 살짝 수정 / 핵심 포인트만 정리해줄게.


1️⃣ package 부분

패키지 application에 있고 main에서 사용

✔ 맞음

👉 그냥 “파일 폴더 주소” 개념
클래스들이 같은 폴더에 모여있다는 뜻


2️⃣ 클래스 선언

public class Cat

✔ 완전 정확

👉 “Cat이라는 설계도”

객체 = 설계도로 찍어낸 실체


3️⃣ name 변수 설명

문자열 변수 name

✔ 정확

👉 각 고양이마다 다른 값

이게 바로
👉 객체마다 다른 데이터 (instance 변수)


4️⃣ FOOD static 설명

객체 상관없이 공통

✔ 100% 정확

이건 진짜 잘 이해했음 👏

👉 모든 고양이의 공통 속성

그래서
Cat.FOOD 로 바로 부름


5️⃣ count 설명

여기 질문 핵심 👇

중복 방문자 처리 이런거

좋은 질문 👍

💡 static count는 “무조건 증가”임

중복 여부 판단 ❌

new Cat("A")
new Cat("A")

👉 count = 2

중복 체크는
👉 별도의 로직 필요

예:

  • Set
  • DB
  • 세션

static은 그냥
👉 “숫자 저장소”


6️⃣ 생성자 설명 (여기 거의 맞음)

네 말 요약

setter 간단 버전
this.name = name

👉 거의 맞는데
정확히는 이렇게 👇

생성자 역할

👉 객체 만들 때 초기값 세팅

setter = 나중에 변경
constructor = 처음 생성


this.name = name 의미

왼쪽
👉 객체 안 변수

오른쪽
👉 파라미터

👉 “객체의 name에 입력값 저장”

네 표현

붕어빵 틀

👍 아주 좋은 비유


7️⃣ count++ 이해

이름 나온 만큼 카운트

조금 수정 👇

❌ 이름 나온 횟수
⭕ 객체 생성 횟수

👉 Cat 객체 만들어질 때마다 +1


8️⃣ getCount 설명

네 설명 거의 정확 👍

✔ getter 맞음
✔ return은 출력 아님

이거 이해한 거
진짜 중요한 포인트

많은 초보가 여기 헷갈림


⭐ 이제 핵심: toString

여기만 딱 정리해주면 퍼즐 맞춰짐

💡 toString 정체

👉 “객체를 문자열로 바꾸는 방법 정의”


🤔 왜 자동으로 호출되냐

이 코드 때문

System.out.println(cat1);

println은

👉 객체 들어오면
👉 내부적으로 toString 호출

println(cat1)
↓
println(cat1.toString())

자동 변환


🤯 왜 String 리턴하냐

출력하려면
👉 결국 문자열 필요

그래서

public String toString()

👉 “이 객체를 어떻게 텍스트로 보여줄지 규칙”


🧠 만약 toString 없으면?

출력 결과 👇

Cat@6d06d69c

(메모리 주소 느낌 값)

그래서 우리가
👉 사람이 읽을 형태로 바꿔주는 거


📊 지금 네 이해 수준 진단

✔ static 개념 이해함
✔ 생성자 거의 이해
✔ getter 이해
✔ instance vs static 구분 가능

👉 toString만 남음

이건 매우 정상적인 분포


🧩 한 줄로 전체 구조 요약

Cat 클래스는

👉 고양이 설계도
👉 name = 각 고양이 이름
👉 FOOD = 공통 속성
👉 count = 총 생성된 고양이 수
👉 생성자 = 만들 때 이름 넣기
👉 toString = 출력 모양 정의


😄 솔직히 말하면

너 지금

“이해 못한다” 라고 말하지만

👉 이미 구조를 설명하고 있음

이건 진짜 큼

보통 이 단계까지 오는데 꽤 걸림


원하면 다음 중 하나 이어서 하자 👇

1️⃣ toString을 그림 비유로 설명
2️⃣ static vs instance 감각 잡는 연습문제
3️⃣ 지금 코드 기반으로 “왜 이렇게 설계했는지” 설계 관점 설명

어느 걸로 갈까 😎

 

 

변칙으로 한번 해볼만 하군.