20260401WED (Day 5)

sungsimdangmascot·2026년 4월 1일

this객체 자기 자신을 가리키는 대명사다.


1. this

사람은 대화할 때 "철수는 밥을 먹는다"라고 제3자처럼 말하지 않는다.
대신 "나는 밥을 먹는다"라고 말한다. 여기서 '나'가 바로 프로그래밍의 this다.

  • 철수 객체의 this: 철수 자신의 데이터를 가리킨다.
  • 영희 객체의 this: 영희 자신의 데이터를 가리킨다.

설계도는 하나(사람 클래스)지만, 실제로 만들어진 몸뚱아리(객체)들이 "이건 내 거야!"라고 주장할 때 this를 쓴다.


2. this 사용 이유

컴퓨터는 이름이 같으면 구분을 못 하는 멍청이다. 아래 상황을 본다.

class 사람 {
  int 나이; // 1. 원래 내 몸에 새겨진 진짜 나이 (인스턴스 변수)

  void 나이설정(int 나이) { // 2. 외부에서 배달 온 새로운 나이 (지역 변수)
    나이 = 나이; // 컴퓨터: "배달 온 나이를 다시 배달 온 곳에 넣으라고?" (혼란)
  }
}

위의 나이 = 나이;는 아무 일도 일어나지 않는다. 컴퓨터가 둘 다 '방금 배달 온 데이터'로 착각하기 때문이다. 이때 this라는 이름표를 붙여주면 상황이 깔끔하게 정리된다.

  void 나이설정(int 나이) {
    this.나이 = 나이; // "내 몸(this)에 있는 진짜 나이 칸에, 배달 온 숫자를 넣어라!"
  }

3. 객체 / 함수

비전공자를 위해 더 쉽게 비유한다.

  • 객체(집 전체): 거실에 나이라는 이름의 금고가 있다. (this.나이)
  • 함수(방 안): 심부름꾼이 나이라고 적힌 쪽지를 들고 들어온다. (지역변수 나이)

방 안에서 그냥 "나이 가져와!" 하면 눈앞에 있는 쪽지를 먼저 본다. 하지만 "거실(this)에 있는 진짜 내 금고를 가져와!"라고 명령하고 싶을 때 this를 사용한다.


4. 요약

  1. this는 "나" : 지금 작동 중인 객체 자기 자신을 뜻한다.
  2. 이름표 역할: 밖에서 들어온 변수와 원래 내 몸에 있던 변수의 이름이 같을 때 구분하려고 쓴다.
  3. 명확한 선언: this.변수명은 "다른 누구도 아닌 바로 내 설계도에 적힌 내 속성"이라는 뜻이다.

=> 배열은 치명적인 단점이 있다. 바로 '끼리끼리'만 모여야 한다는 점이다. 이 문제를 해결하기 위해 등장한 것이 바로 객체(Object)다.


1. 배열의 한계

배열은 같은 타입의 데이터만 담을 수 있다.

  • int[]에는 숫자만 담는다.
  • String[]에는 글자만 담는다.

하지만 '사람'이라는 정보를 저장하려면 나이(숫자), 이름(글자), 결혼여부(논리)가 다 필요하다. 배열로는 이 데이터를 한 바구니에 담을 수 없다. 그래서 우리는 "사용자 정의 객체"를 만든다.


2. 클래스(Class) : 설계도

클래스는 쉽게 말해 설계도 혹은 붕어빵 틀이다. "앞으로 '사람'이라는 데이터를 만들 건데, 거기엔 나이, 이름, 사는곳, 결혼여부가 들어갈 거야!"라고 선언하는 것이다.

  • 속성(변수): 명사적인 표현. 객체가 가지는 데이터다. (나이, 이름 등)
  • 기능(함수): 동사적인 표현. 객체가 하는 행동이다. (자기소개 등)

3. 객체 생성(new)

설계도만 있다고 사람이 태어나지는 않는다. new라는 키워드를 써야 비로소 메모리에 실제 '사람'이 만들어진다.

사람 a사람1 = new 사람();

이 문장은 "사람 설계도대로 실제 사람(객체) 하나를 메모리에 만들고, 그걸 a사람1이라고 부르겠다"는 뜻이다. 이렇게 만들어진 실체를 인스턴스(Instance)라고 부른다.


4. 코드 분석

① 데이터 채우기 (변수 사용)

a사람1.나이 = 20;
a사람1.이름 = "김철수";

. (점)은 "~안에 있는"이라는 뜻이다. a사람1이라는 객체 안에 있는 나이 칸에 20을 집어넣는다는 의미다.

② 기능 실행하기 (함수 호출)

a사람1.자기소개();

객체에게 명령을 내린다. "야, 너 설계도에 적힌 대로 자기소개 좀 해봐!"라고 시키는 것이다.


5. (복습)

사용자가 제공한 코드의 자기소개() 함수를 다시 본다.

void 자기소개(){
  System.out.println("나이 : 20"); // 그냥 글자
}

이렇게 쓰면 a사람1.나이 = 21;로 나이를 바꿔도, 자기소개를 시키면 여전히 "20"이라고 말한다. 진짜 내 데이터를 말하게 하려면 아까 배운 this를 써야 한다.

void 자기소개(){
  System.out.println("나이 : " + this.나이); // 진짜 나이를 호출
}

6. 요약

  1. 배열은 한계가 있다: 여러 타입을 섞을 수 없다.
  2. 클래스는 설계도다: 내가 원하는 데이터들을 묶어서 새로운 타입을 만든다.
  3. 객체는 실물이다: new를 통해 설계도를 실제 메모리에 구현한다.
  4. 속성은 변수, 기능은 함수: 명사는 변수로, 동사는 함수로 만든다.

객체지향 / 설계도와 리모컨의 원리

1. 전체 코드 보기

먼저 우리가 분석할 전체 코드를 확인한다.

class Main {
  public static void main(String[] args) {
    // 1. 변수 선언 (리모컨 생성)
    자동차 a자동차; 
    
    // 2. 객체 생성 및 연결 (실물 생성과 리모컨 교체)
    a자동차 = new 자동차(); 
    
    // 3. 메소드 호출 (리모컨 버튼 누르기)
    a자동차.달리다(); 
  }
}

// 4. 클래스 정의 (설계도)
class 자동차 { 
  void 달리다() {  --> 리모콘처럼 달리다 하는 코드만 출력하기에 결과값이 없는 void 를 사용한다.
    System.out.println("자동차가 달립니다.");
  }
}

2. 단계별 상세 분석 (과정 설명 대입)

Step 1. 설계도(클래스)를 만든다

해당 코드: class 자동차 { ... }

  • 설명: 객체를 만들기 전, 자동차가 어떤 기능을 가질지 정의하는 청사진이다.
  • 핵심: 설계도만으로는 아무런 동작을 할 수 없다. 설계도는 객체를 만들기 위한 틀일 뿐이다.

Step 2. 설계도로 리모컨 변수를 만든다

해당 코드: 자동차 a자동차;

  • 설명: 자동차를 조종할 '리모컨'을 저장할 변수 공간을 확보한다.
  • 부가설명: 이 시점의 a자동차 변수에는 아직 연결된 실체가 없는 쓰레기 리모컨이 담겨 있다. (자바에서는 이 상태로 버튼을 누르려 하면 에러가 난다!)

Step 3. 객체를 만들고 리모컨을 변수에 저장한다

해당 코드: a자동차 = new 자동차();

  • 설명: new 자동차(); 명령을 통해 메모리 어딘가에 실제 자동차 객체를 찍어낸다.
  • 부가설명: 객체가 만들어짐과 동시에 그 객체를 조종할 수 있는 진짜 리모컨이 제공된다.
  • 대체 과정: = 연산자를 통해 새 리모컨이 a자동차 변수에 저장된다. 이로써 기존의 쓰레기 리모컨은 사라지고 진짜 리모컨이 자리를 잡는다.

Step 4. 리모컨을 사용하여 객체를 원격조종한다

해당 코드: a자동차.달리다();

  • 설명: a자동차 리모컨에 있는 '달리다' 버튼을 누르는 과정이다.
  • 부가설명: 설계도(class 자동차)에서 void 달리다()를 정의했기 때문에 리모컨에 버튼이 생성된 것이다. 버튼을 누르면 멀리 떨어져 있는 객체가 설계도에 적힌 내용(System.out.println)을 실행한다.

3. 요약: 설계도로 할 수 있는 2가지

  1. 객체 만들기: new를 통해 메모리에 실물을 생성한다.
  2. 리모컨 만들기: 해당 객체를 멀리서도 조종할 수 있는 규격화된 버튼(메소드)을 제공한다.

최종 정리

1. 배열의 한계

기본 배열은 치명적인 단점이 하나 있다. 똑같은 타입만 담을 수 있다는 것.

  • 정수 배열(int[]): 숫자만 담을 수 있다.
  • 실수 배열(double[]): 실수(소수점)만 담을 수 있다.
  • 문자열 배열(String[]): 글자만 담을 수 있다.

만약 우리가 '사람' 한 명에 대한 정보를 한 곳에 묶고 싶다면 어떻게 될까?
사람을 표현할 때는 보통 이름(String), 나이(int), 결혼여부(boolean) 등과 같은 정보를 사용한다. 즉, 각각 데이터의 타입이 다르다.
이것들을 하나의 배열에 담으려고 하면 타입이 맞지 않아 굉장히 까다로워진다.

이 문제를 해결하기 위해 사용자 정의 객체를 사용한다.


2. 클래스(설계도)와 객체(실물)

객체를 만들기 위해서는 가장 먼저 설계도가 필요하다. 이 설계도를 우리는 클래스(Class)라고 부른니다.

  • 클래스(설계도): "사람이라면 나이, 이름, 사는 곳에 대한 정보가 있어야 하고, 자기소개를 할 수 있어야 한다"라고 정의해 둔 종이 한 장이다.
  • 객체(실제 물건): 그 설계도를 보고 메모리에 실제로 만들어낸 '진짜 사람' 데이터다.

클래스의 2가지 구성 요소

클래스 안에는 크게 두 가지가 들어간다.
1. 속성(변수): 그 대상이 가지고 있는 특징 (ex: 나이, 이름, 사는 곳) -> 명사
2. 기능(함수/메서드): 그 대상이 할 수 있는 행동 (ex: 자기소개, 걷기) -> 동사

코드 예시

class 사람 {
  // 1. 속성(변수) 정의
  int 나이;
  String 이름;
  String 사는곳;
  boolean 결혼여부;

  // 2. 기능(함수/메서드) 정의
  void 자기소개() {
    System.out.println("안녕하세요, 저는 " + 이름 + "입니다.");
  }
}

3. 객체를 생성하고 사용하기 (new)

설계도(class 사람)를 멋지게 그렸다고 해서, 바로 허공에서 진짜 사람이 뿅 하고 생겨나는 것은 아니다. new라는 키워드를 사용해서 설계도대로 실제 객체를 만들어내야 한다.

// 1. 사람 객체 생성 (설계도를 바탕으로 실체 만들기)
사람 a사람1 = new 사람();

// 2. 속성 채워넣기 (점 '.'을 사용해서 접근한다)
a사람1.나이 = 20;
a사람1.이름 = "김철수";

// 3. 기능 실행 (클래스에 정의된 기능 작동시키기)
a사람1.자기소개(); // 함수 호출

Tip: a사람1.자기소개(); 처럼 점(.)을 찍고 함수를 부르는 것은, 리모컨에 있는 버튼을 누른다라고 생각하면 이해하기가 아주 편하다.


4. 객체가 만들어지는 과정 (메모리 구조)

new 사람()을 했을 때, 컴퓨터 내부(메모리)에서는 어떤 일이 벌어질까?

  1. 스택(Stack) 영역 : a사람1이라는 변수(리모컨)가 만들어진다.
  2. 힙(Heap) 영역 : new 사람()을 통해 힙 영역에 아주 넓은 집(객체)이 하나 지어진다. 그 집 안에는 나이, 이름 등을 저장할 수 있는 각각의 방이 있다.
  3. 연결 : 스택에 있는 변수(리모컨)가 힙에 있는 집의 주소를 저장한다. 즉, 우리는 이 변수를 통해서 저 멀리 있는 집의 방을 고치거나 기능을 사용할 수 있게 되는 것이다.

5. 핵심 개념 요약 정리

지금까지 배운 내용을 한 줄씩 정리해 본다.

  • 배열 - 같은 타입만 담을 수 있다.
  • 객체 - 서로 다른 타입의 데이터를 하나로 묶은 '종합 선물 세트'다.
  • 클래스 - 객체를 만들기 위한 설계도이다.
  • 변수 - 대상의 속성(상태)을 나타낸다.
  • 함수(메서드) - 대상의 기능(동작)을 나타낸다.

6. this 개념

클래스 안에서 쓰이는 아주 특별한 단어가 있다. 바로 this다.
this의 의미는 단순하다. 바로 "나"다. 즉, 객체 자기 자신을 가리키는 예약어다.

우리가 현실에서 친구들과 대화할 때 "내 이름은 철수야"라고 하지, 굳이 제3자처럼 "철수의 이름은 철수야"라고 말하지 않는다. 프로그래밍에서도 마찬가지다. 객체가 자기 안의 변수나 함수를 부를 때 "내 거!"라고 표현하는 방식이 바로 this다.

그렇다면 this를 왜 굳이 사용할까?

클래스 안에는 두 종류의 변수가 존재할 수 있기 때문이다.

  1. 인스턴스 변수: 객체(집) 자체에 속한 진짜 변수 (ex: this.나이)
  2. 지역 변수: 함수(방) 안에서만 잠깐 만들어져 쓰이고 사라지는 변수 (ex: int 나이)

만약 이 둘의 이름이 똑같다면, 컴퓨터는 어떤 게 진짜 내 나이(속성)인지 헷갈려 한다.
이때 this를 딱 붙여주면, "이건 함수 안에서 만든 가짜가 아니라, 내 설계도에 적힌 진짜 내 속성이다!"라고 컴퓨터에게 명확하게 알려줄 수 있다.


profile
성심당마스코트

0개의 댓글