OOP self 와 this키워드의 의미 부제:self 와 this가 가리키는 메모리 주소는 인스턴스의 주소지 클래스의 주소가 아니다
OOP에서 self와 this의 의미
부제: self와 this가 가리키는 건 클래스가 아니라 인스턴스다
oop에서 self this키워드듣 사용하는건
sql문에서 join문을 하기위해 여러테이블의 같은이름의 속성이 어느테이블에 속해있는지
헷갈려서 오류가 발생하는 경우를 해결하기위해 존재하는 join 제약조건과 비슷한개념이다
객체지향 프로그래밍(OOP)을 공부하다 보면 파이썬의 self, 자바나 C++의 this라는 키워드를 자주 만나게 됩니다. 둘 다 "자기 자신"을 가리킨다고 배우지만, 여기서 중요한 건 self와 this가 클래스 자체가 아니라 ‘인스턴스’를 가리킨다는 점입니다.
self와 this가 인스턴스를 가리키는 이유
-
인스턴스별 데이터 접근
클래스는 일종의 설계도에 불과합니다. 데이터는 클래스가 아니라, 이 설계도를 바탕으로 만들어진 실제 객체(인스턴스)에 담깁니다.
self와 this는 바로 그 인스턴스를 가리키며, 인스턴스 변수(속성)와 메서드에 접근할 수 있게 해줍니다. -
자기 자신 참조
메서드 안에서 "나 자신"을 불러야 할 때 self나 this를 사용합니다.
예를 들어,Person클래스가 있고, 그 안에name속성이 있다고 합시다.my_person.print_name()을 실행하면 self(또는 this)는my_person인스턴스를 가리키며,self.name을 통해 해당 인스턴스의 데이터를 읽을 수 있습니다. -
여러 인스턴스 구분
같은 클래스로 여러 인스턴스를 만들면, 각 self와 this는 각기 다른 인스턴스를 가리킵니다. 그래서 같은 메서드라도 인스턴스마다 다른 결과를 낼 수 있는 거죠.
언어별 차이
| 특징 | 파이썬 (self) | 자바 (this) |
|---|---|---|
| 명시성 | 메서드의 첫 번째 매개변수로 self를 직접 적어줘야 함 |
메서드 안에서 자동으로 존재, 필요할 때만 적음 |
| 인스턴스 생성 시 | 생성된 인스턴스를 self에 자동 전달 |
생성된 인스턴스를 this가 자동 참조 |
| 사용처 | 모든 인스턴스 메서드에서 속성/메서드 접근에 사용 | 주로 변수 이름 충돌 방지, 자기 자신 참조 |
코드 예시
파이썬 (self)
class Dog:
def __init__(self, name):
self.name = name # self는 인스턴스를 가리킴
def bark(self):
print(f"{self.name}이(가) 짖습니다.")
dog1 = Dog("바둑이")
dog2 = Dog("흰둥이")
dog1.bark() # 출력: 바둑이이(가) 짖습니다. → self는 dog1
dog2.bark() # 출력: 흰둥이이(가) 짖습니다. → self는 dog2
여기서 self는 클래스가 아니라 dog1, dog2라는 각각의 인스턴스를 가리킵니다.
자바 (this)
public class Car {
String color;
public Car(String color) {
this.color = color; // 매개변수 color와 인스턴스 변수 color 구분
}
public void displayColor() {
System.out.println("이 차의 색상은 " + this.color + "입니다.");
}
}
Car myCar = new Car("빨간색");
Car yourCar = new Car("파란색");
myCar.displayColor(); // 출력: 이 차의 색상은 빨간색입니다. → this는 myCar
yourCar.displayColor(); // 출력: 이 차의 색상은 파란색입니다. → this는 yourCar
여기서도 this는 클래스 Car가 아니라 실제 만들어진 myCar, yourCar 객체를 가리킵니다.
정리
-
self / this = 인스턴스의 참조
-
클래스는 단순한 설계도일 뿐, 데이터는 인스턴스에 저장됨
-
따라서 self와 this는 언제나 "클래스의 주소"가 아니라 "인스턴스의 주소"를 가리킨다
객체지향 프로그래밍을 이해할 때 가장 헷갈리기 쉬운 부분이 바로 이 차이인데, 한 번 감을 잡아두면 이후 코드 읽기와 작성이 훨씬 수월해집니다.
댓글
댓글 쓰기