this는 객체 자기 자신을 가리키는 대명사다.this사람은 대화할 때 "철수는 밥을 먹는다"라고 제3자처럼 말하지 않는다.
대신 "나는 밥을 먹는다"라고 말한다. 여기서 '나'가 바로 프로그래밍의 this다.
this: 철수 자신의 데이터를 가리킨다.this: 영희 자신의 데이터를 가리킨다.설계도는 하나(사람 클래스)지만, 실제로 만들어진 몸뚱아리(객체)들이 "이건 내 거야!"라고 주장할 때 this를 쓴다.
this 사용 이유컴퓨터는 이름이 같으면 구분을 못 하는 멍청이다. 아래 상황을 본다.
class 사람 {
int 나이; // 1. 원래 내 몸에 새겨진 진짜 나이 (인스턴스 변수)
void 나이설정(int 나이) { // 2. 외부에서 배달 온 새로운 나이 (지역 변수)
나이 = 나이; // 컴퓨터: "배달 온 나이를 다시 배달 온 곳에 넣으라고?" (혼란)
}
}
위의 나이 = 나이;는 아무 일도 일어나지 않는다. 컴퓨터가 둘 다 '방금 배달 온 데이터'로 착각하기 때문이다. 이때 this라는 이름표를 붙여주면 상황이 깔끔하게 정리된다.
void 나이설정(int 나이) {
this.나이 = 나이; // "내 몸(this)에 있는 진짜 나이 칸에, 배달 온 숫자를 넣어라!"
}
비전공자를 위해 더 쉽게 비유한다.
나이라는 이름의 금고가 있다. (this.나이)나이라고 적힌 쪽지를 들고 들어온다. (지역변수 나이)방 안에서 그냥 "나이 가져와!" 하면 눈앞에 있는 쪽지를 먼저 본다. 하지만 "거실(this)에 있는 진짜 내 금고를 가져와!"라고 명령하고 싶을 때 this를 사용한다.
this는 "나" : 지금 작동 중인 객체 자기 자신을 뜻한다.this.변수명은 "다른 누구도 아닌 바로 내 설계도에 적힌 내 속성"이라는 뜻이다.=> 배열은 치명적인 단점이 있다. 바로 '끼리끼리'만 모여야 한다는 점이다. 이 문제를 해결하기 위해 등장한 것이 바로 객체(Object)다.
배열은 같은 타입의 데이터만 담을 수 있다.
int[]에는 숫자만 담는다.String[]에는 글자만 담는다.하지만 '사람'이라는 정보를 저장하려면 나이(숫자), 이름(글자), 결혼여부(논리)가 다 필요하다. 배열로는 이 데이터를 한 바구니에 담을 수 없다. 그래서 우리는 "사용자 정의 객체"를 만든다.
클래스는 쉽게 말해 설계도 혹은 붕어빵 틀이다. "앞으로 '사람'이라는 데이터를 만들 건데, 거기엔 나이, 이름, 사는곳, 결혼여부가 들어갈 거야!"라고 선언하는 것이다.
설계도만 있다고 사람이 태어나지는 않는다. new라는 키워드를 써야 비로소 메모리에 실제 '사람'이 만들어진다.
사람 a사람1 = new 사람();
이 문장은 "사람 설계도대로 실제 사람(객체) 하나를 메모리에 만들고, 그걸 a사람1이라고 부르겠다"는 뜻이다. 이렇게 만들어진 실체를 인스턴스(Instance)라고 부른다.
a사람1.나이 = 20;
a사람1.이름 = "김철수";
. (점)은 "~안에 있는"이라는 뜻이다. a사람1이라는 객체 안에 있는 나이 칸에 20을 집어넣는다는 의미다.
a사람1.자기소개();
객체에게 명령을 내린다. "야, 너 설계도에 적힌 대로 자기소개 좀 해봐!"라고 시키는 것이다.
사용자가 제공한 코드의 자기소개() 함수를 다시 본다.
void 자기소개(){
System.out.println("나이 : 20"); // 그냥 글자
}
이렇게 쓰면 a사람1.나이 = 21;로 나이를 바꿔도, 자기소개를 시키면 여전히 "20"이라고 말한다. 진짜 내 데이터를 말하게 하려면 아까 배운 this를 써야 한다.
void 자기소개(){
System.out.println("나이 : " + this.나이); // 진짜 나이를 호출
}
new를 통해 설계도를 실제 메모리에 구현한다.먼저 우리가 분석할 전체 코드를 확인한다.
class Main {
public static void main(String[] args) {
// 1. 변수 선언 (리모컨 생성)
자동차 a자동차;
// 2. 객체 생성 및 연결 (실물 생성과 리모컨 교체)
a자동차 = new 자동차();
// 3. 메소드 호출 (리모컨 버튼 누르기)
a자동차.달리다();
}
}
// 4. 클래스 정의 (설계도)
class 자동차 {
void 달리다() { --> 리모콘처럼 달리다 하는 코드만 출력하기에 결과값이 없는 void 를 사용한다.
System.out.println("자동차가 달립니다.");
}
}
해당 코드:
class 자동차 { ... }
해당 코드:
자동차 a자동차;
a자동차 변수에는 아직 연결된 실체가 없는 쓰레기 리모컨이 담겨 있다. (자바에서는 이 상태로 버튼을 누르려 하면 에러가 난다!)해당 코드:
a자동차 = new 자동차();
new 자동차(); 명령을 통해 메모리 어딘가에 실제 자동차 객체를 찍어낸다. = 연산자를 통해 새 리모컨이 a자동차 변수에 저장된다. 이로써 기존의 쓰레기 리모컨은 사라지고 진짜 리모컨이 자리를 잡는다.해당 코드:
a자동차.달리다();
a자동차 리모컨에 있는 '달리다' 버튼을 누르는 과정이다.class 자동차)에서 void 달리다()를 정의했기 때문에 리모컨에 버튼이 생성된 것이다. 버튼을 누르면 멀리 떨어져 있는 객체가 설계도에 적힌 내용(System.out.println)을 실행한다.new를 통해 메모리에 실물을 생성한다.기본 배열은 치명적인 단점이 하나 있다. 똑같은 타입만 담을 수 있다는 것.
정수 배열(int[]): 숫자만 담을 수 있다.실수 배열(double[]): 실수(소수점)만 담을 수 있다.문자열 배열(String[]): 글자만 담을 수 있다.만약 우리가 '사람' 한 명에 대한 정보를 한 곳에 묶고 싶다면 어떻게 될까?
사람을 표현할 때는 보통 이름(String), 나이(int), 결혼여부(boolean) 등과 같은 정보를 사용한다. 즉, 각각 데이터의 타입이 다르다.
이것들을 하나의 배열에 담으려고 하면 타입이 맞지 않아 굉장히 까다로워진다.
이 문제를 해결하기 위해 사용자 정의 객체를 사용한다.
객체를 만들기 위해서는 가장 먼저 설계도가 필요하다. 이 설계도를 우리는 클래스(Class)라고 부른니다.
클래스 안에는 크게 두 가지가 들어간다.
1. 속성(변수): 그 대상이 가지고 있는 특징 (ex: 나이, 이름, 사는 곳) -> 명사
2. 기능(함수/메서드): 그 대상이 할 수 있는 행동 (ex: 자기소개, 걷기) -> 동사
코드 예시
class 사람 {
// 1. 속성(변수) 정의
int 나이;
String 이름;
String 사는곳;
boolean 결혼여부;
// 2. 기능(함수/메서드) 정의
void 자기소개() {
System.out.println("안녕하세요, 저는 " + 이름 + "입니다.");
}
}
new)설계도(class 사람)를 멋지게 그렸다고 해서, 바로 허공에서 진짜 사람이 뿅 하고 생겨나는 것은 아니다. new라는 키워드를 사용해서 설계도대로 실제 객체를 만들어내야 한다.
// 1. 사람 객체 생성 (설계도를 바탕으로 실체 만들기)
사람 a사람1 = new 사람();
// 2. 속성 채워넣기 (점 '.'을 사용해서 접근한다)
a사람1.나이 = 20;
a사람1.이름 = "김철수";
// 3. 기능 실행 (클래스에 정의된 기능 작동시키기)
a사람1.자기소개(); // 함수 호출
Tip:
a사람1.자기소개();처럼 점(.)을 찍고 함수를 부르는 것은, 리모컨에 있는 버튼을 누른다라고 생각하면 이해하기가 아주 편하다.
new 사람()을 했을 때, 컴퓨터 내부(메모리)에서는 어떤 일이 벌어질까?
a사람1이라는 변수(리모컨)가 만들어진다.new 사람()을 통해 힙 영역에 아주 넓은 집(객체)이 하나 지어진다. 그 집 안에는 나이, 이름 등을 저장할 수 있는 각각의 방이 있다.지금까지 배운 내용을 한 줄씩 정리해 본다.
this 개념클래스 안에서 쓰이는 아주 특별한 단어가 있다. 바로 this다.
this의 의미는 단순하다. 바로 "나"다. 즉, 객체 자기 자신을 가리키는 예약어다.
우리가 현실에서 친구들과 대화할 때 "내 이름은 철수야"라고 하지, 굳이 제3자처럼 "철수의 이름은 철수야"라고 말하지 않는다. 프로그래밍에서도 마찬가지다. 객체가 자기 안의 변수나 함수를 부를 때 "내 거!"라고 표현하는 방식이 바로 this다.
this를 왜 굳이 사용할까?클래스 안에는 두 종류의 변수가 존재할 수 있기 때문이다.
this.나이)int 나이)만약 이 둘의 이름이 똑같다면, 컴퓨터는 어떤 게 진짜 내 나이(속성)인지 헷갈려 한다.
이때 this를 딱 붙여주면, "이건 함수 안에서 만든 가짜가 아니라, 내 설계도에 적힌 진짜 내 속성이다!"라고 컴퓨터에게 명확하게 알려줄 수 있다.