Wanna be Brilliant Full-Stack Developer

Java 객체지향 프로그래밍 문법 클래스만들기(This) #5 본문

Some Memos/Java

Java 객체지향 프로그래밍 문법 클래스만들기(This) #5

Flashpacker 2022. 3. 3. 12:59


1) This란 무엇인가?

package ch04;

public class People {
	String name;
	int age;
	
	//디폴트 생성자가 있을까요? 
}

디폴트 생성자가 있을까? 있다 내가 따로 생성자를 따로 안만들었기때문에 있는것이다

언제 만들어질까? .java 를 .class로 컴파일을 할때 자바가 자동으로 코드를 만들어줌! 

그리고 변수들을 초기화하지 않았다! 왜냐하면 다양성을 위해서! 

 

package ch04;

public class People {
	String name;
	int age;
	
	//디폴트 생성자가 있을까요? 있음 -> .java -> .class 컴파일할때 자바가 자동으로 코드를 만들어줌
	public People() {
		System.out.println("디폴트 생성자");
	}
}

디폴트 생성자를 직접 적어보고 

package ch04;

public class PeopleApp {

	public static void main(String[] args) {
		People p1 = new People();
		
	}

}

이렇게 실행하면

new People()이 때린건 디폴트 생성자를 호출한것이다! 

package ch04;

public class People {
	String name;
	int age;
	
	//디폴트 생성자가 있을까요? 있음 -> .java -> .class 컴파일할때 자바가 자동으로 코드를 만들어줌
		public People(String name, int age) {
			
		}
}

생성자 ( ) 괄호 안에 있는것을 매개변수라고한다!  자판기의 동전투입구와 같다 

하지만 이렇게 하면 PeopleApp.java에서 오류가 나오고 저 오류 내용은 People() 디폴트 생성자라고 하는데 없다고한다.

왜냐하면 내가 직접 정의를 했기떄문에 디폴트생성자는 없다. 

 

이제 동전투입구가 두개가 있으니까 투입을 해주면 된다. String 타입과 int 타입으로!

package ch04;

public class PeopleApp {

	public static void main(String[] args) {
		People p1 = new People("홍길동", 25);
		
	}

}

여기서 new People을 컨트롤로 무엇을 가리키는지 찾아가면 

내가직접 만든 생성자를 호출하고있다! 

내가 동전투입구에다가 홍길동과 25를 넣었으니까 실제로 값이 String name 에는 " 홍길동 " 이 들어오고 

int age에는 25가 들어왔을것이다. 

이렇게 name은 홍길동 , age는 25를 받은것이다 

자판기가 동전을 두개를 받은것이다, 지폐하나 동전 하나를 받은것이다  

저 People p1 = new People("홍길동", 25); 여기에 홍길동과 25를 인수라고 한다! 

인수를 넘겨서 매개변수가 받은것이다 , 받아서 출력한것이다

지금까지를 메모리상의 그림으로 표현해보려고한다

 

파일이 두개만있다고 가정하고 말해보자

PeopleApp이라는 클래스 입장에서는 People 을 두개를 비교해보자면

People을 보면 Static 적혀있는것이 있는가? 없다. Static 공간에 떠있는게 아무것도 없다.

heap공간에는 무엇이 있는가? 아직 아무것도 없다 heap공간에는 new를 해야 뜬다 

stack 도 실행시에 메모리에 뜨기 떄문에 아무것도 없다. 

Heap과 Stack 도 비어있다. 

 

그다음에 PeopleApp을 보자면 Static이 하나 있다! Main이 있음

그다음에 아무것도 뜬게 없다. 그러면 자바가 실행하며 Main메소드를 실행한다! 

6번라인이 실행되고 메인 메소드를 실행할때 메인의 큐를 보면 이때 머가뜨냐면 

Stack 공간에 가장 하단에 main이라는 메서드에 저장공간이 뜰것이고 그안에는 아무것도 아직 없다.

메인 메서드가 실행될때 6번 라인이 메모리에 뜨는데 메모리에 뜨면서 메인큐에는 6번밖에 없는데 (실행할께 6번밖에 없음)

 

제일 처음에 6번을 실행하고 프로그램이종료될텐데

행할떄 Stack에 Main 메서드 저장공간이 뜨고 

여기 보면 변수가 하나 만들어져 있다. People의 p1 

p1이 stack 공간에 뜬다 이거는 지역변수이다 왜냐하면 Stack이 들고있으면 지역변수이다

 

왜냐하면 Stack이 들고 있는 변수들은 메소드 변수들이기 떄문에
메소드는 실행시에만 메모리에 뜨기 떄문에! 

 

옆에 보면 new People이 있으니까 new를 했으니까 People에 있는것이 메모리에 다뜰것이다 

new를 하면 Static이 아닌 모든것을 다 띄우니까

String name과 int age와 People(생성자) 가 메모리에 다 뜰것이다.

어디 메모리에 뜨냐면 heap공간에 뜬다! People의 heap공간에 뜰것이다. 

name , age , people() 

new를 하고나면 뒤에있는 생성자(People)를 호출한다!
애가 호출이 될수 있는 근거는 new를 해서 메모리에 떴기 떄문이다.
new를 하는 순간 생성자를 호출한다 그떄 데이터 2개를 전송했다 매개변수를 통해 

첫번쨰 인수는 문자열 , 두번쨰 인수는 숫자 홍길동, 25가 People.java에 생성자에 날라간다

그리고 People에 있는 생성자가 실행된다! 

실행이 되니까 People의 Stack이 열린다 , 제일 밑에 People() 생성자, 메소드가 열린다. 

그리고 name 에는 홍길동, age에는 25가 들어왔다. 

People의 생성자(메소드) 실행되고 Stack 메모리 저장공간에 값이 들어왔다.

들어와서 모니터는 출력한것이 다인데? 

모니터 화면에 출력할것인데? 

System.out.println("People 메서드 스택 name : " +name );
System.out.println("People 메서드 스택 age : " +age ); 이곳에 있는 name이랑 age를 출력할것인데

여기에 있는 name과 age는 초기화 하지 않은 String name; , int age일까요?

아니면 생성자 안에 있는 매개변수에 있는 String name, int age일까요? 

 

다시 얘기 하면 People Stack공간에 있는 name과 age일까요? 아니면 heap이 들고 있는 name age 일까요? 

당연히 가까이 있는 매개변수의 값이다. 가까이 있는것을 먼저 찾는다! 

굉장히 중요한 개념인데 이름이 똑같다 name , age 이다. 

 

System.out.println("People 메서드 스택 name : " +name );
System.out.println("People 메서드 스택 age : " +age );

그러면 이 둘 입장에서는 누구를 써야할지 모른다

근데 규칙으로 정해져있다. 가까이있는것을 찾는다! 그래서 이 둘은 People Stack 내부니까 당연히 가까이 있는 매개변수들것을 찾아온다!

그러면 우리가 정의한 클래스 People이라는 상태가 무엇이였냐? 그건 heap공간에 name과 age이다.이둘이 상태인데 

이 상태가 변했나? 안변했나? 이 상태는 그대로이다. 이 둘의 값은 Null값이다 값을 안넣어줬다. 

그러면 저 Stack 공간에 있는 name 과 age 값을 heap 공간에 그대로 넣어주면된다.

최종 목표는 stack공간에 있는 name 과 age에 받은 값을 heap 공간에 있는 상태 name 과 age 값에 넣어주는것이다 

 name 에다가 name을 넣어줘야하는게 말이 안된다. 

 

전에 Cat할떄는 변수 이름이 n 과 c 였으니 확실히 기본 상태 값이 다르기떄문에

name = n; , color = c;가 가능하였는데? 

변수이름이 똑같으면 가까이 있는것만 찾게 된다. 

 

이러한 문제를 해결하기 위한 방법은 This 라는것이다 .

This가 무엇인가? 

this로 하니까 파란색으로 바뀐다.

이렇게 하면 this 가 무엇이냐면 this라는건 자기자신의 heap공간을 가리킨다. 

이건 자바에서 키워드이다. 키워드라는건 이미 있는걸 얘기한다 자바에서 만들어준것!

Public 키워드인가? 키워드이다. Void? 키워드이다. 

This는 heap공간에 String name과 int age를 가리킨다!

 

그러면 이렇게 되는것이다. People stack이 들고 있는 name과 age를 this.name과 this.age에 넣어줬다는것은

This를 통해 People stack에 있는 name과 age의 값을 heap 공간에 있는 name 과 age에 넣어줬다

this가 무엇인가? This라는 키워드를 이용하여 자기 자신의 Heap 공간을 이야기한다 

People이 new될때 heap 공간에

People이 new가 될때 이 공간이 heap공간에 다 뜬다

쫙 다 뜰때 그 공간을 this라고한다! 

 

이공간을 부르는 이름은 하나 더있다. P1도 heap 공간을 가리킨다. 

이공간을 가리키는 주소가 2개이다. p1과 this 

그러면 p1은 왜 가리킬수 있냐면 내가 new 하고나서 p1으로 가리키고 있었기 떄문에!

메모리에 딱 만들고나서 p1으로 가리키고 있었는데 만들어 준애가
main메서드 에 Stack 내부에 People p1 여기에 만들었기 때문에

People이 메모리에 뜨면 People() 생성자 입장에서는 p1을 알수가 없다. 

그래서 여기에선 this라는 키워드를 쓴다!

 

신과 인간들은 각자 다른공간에 있다

여기서 쉽게 정리하면 This는 자기자신의 heap공간을 가르킨다!

 

마무리! 만약에 People 설계도가 있고 이설계도를 통해서 이세상에 뿌리를 내릴것이다

이세상은 메모리 세상이다

뿌리 내릴떄 우리가 사용하는 키워든는 new이다. 

new에서 뿌리를 내릴떄 여기에 위치가 있고 서울, 대구, 제주도 라고 하면 

new해서 뿌리 내릴떄 뿌리고나서 홍길동이라고 생겼다.

신에 입장에서는 홍길동이 어디있는지 알고있어야한다! 

홍길동은 대구에 있다라는 주소를 가르키고 있다. 대구에 있다는것을 신의 입장에서 알수있다. 

new할떄마다 그 공간을 가르키고 있으니까

이러한식으로

new를 하고 이세상에 뿌리 내리고 주소 대구를 알고 있고
또 new를해서 뿌
리내리고 서울에 한명 만들어졌다. 임꺽정

대구에는 홍길동, 서울에는 임꺽정 

또 new를 해서 제주도에는 장보고가 있다는 주소를 다 신은 가지고 있다

그러면 임꺽정은 서울에 있고 홍길동은 대구에 있고 장보고는 제주도에 있다

이 공간을 부르는 이름이 하나 더있다. 누가 부르는거냐면 

this라는건 임꺽정이 자기 자신을 부를떄 이야기하는것이다. 

 

임꺽정 스스로가 나는 누구지? 나는 this이다. 홍길동과 장보고 도 나는 누구지 ? 나는 This이다 

신의 입장에서는 홍길동은 대구, 임꺽정은 서울, 장보고는 제주도에 있는거지만 

자기 자신은 나는 어디있는가? 대구에 있는거이기도 하지만 this에 있다고 한다

내 공간을 this라고 한다. 나는 This에 있어! 

 

신의 입장에서 보면 홍길동은 this에 있는가? 아니다 대구에 있다. 신은 다른공간에 있다

신이 있는 공간과 홍길동,임꺽정, 장보고있는 공간이 다르다

자기가 있는 공간을 가리키는것이 this이다! 


package ch04;

class Food {
	String name;
	int price;


	public Food(String name, int price) {
		this.name = name;
		this.price = price;
	}
	
	void myPrint() {
		System.out.println(name + " 가격은 " + price + " 입니다. ");
	}
	
}

public class ExampleEx01 {

	public static void main(String[] args) {
		Food f1 = new Food("치킨", 2000);
		Food f2 = new Food("피자", 5000);
		
		
		f1.myPrint();
		f2.myPrint();

	}

}