1. this()와 super()
| this | super | |
| 정의 | 현재 객체 자신(self)의 참조값 | 부모 객체(parent)의 참조값 |
| 변수, 메소드 | this.name (내 필드, 메소드) | super.name (부모의 필드, 메소드) |
| 생성자 | this(): 자신의 다른 생성자를 호출 | super(): 부모의 생성자를 호출 |
* this()와 super()는 반드시 생성자의 첫 줄에만 올 수 있다. (부모가 먼저 초기화 되어야 자식도 초기화 될 수 있기 때문이다.)
2. Up-casting과 Down-casting

public class Test {
public static void main(String[] args) {
Shape shape = new Rectangle(); // up-casting
Rectangle rect = (Rectangle) shape; // down-casting
}
}
- Up-casting: 자식 클래스가 부모 클래스 타입으로 참조되는 것
- 다형성(Polymorphism) 구현에 활용
- Down-casting: 부모 클래스 타입의 클래스로 참조가 이뤄진 이후 다시 자식 클래스로 참조하는 것
- 부모 타입으로 레퍼런스된 자식클래스의 고유 메소드(오버라이드되지 않은 메소드)를 호출할 때 반드시 다운캐스팅이 필요 (부모 타입의 레퍼런스로는 접근할 수 없다.)
- 다운캐스팅은 기존에 이미 참조된 것을 다운하는 것만 가능하다. (처음부터는 불가능하다)
3. 다형성 (Polymorphism)
: 하나의 참조 변수로 여러 객체를 참조하거나, 하나의 메소드가 여러 방식으로 동작하는 게 하는 것을 말한다. 다형성은 상속 + 오버라이딩 + Up-casting으로 구현된다. 상속 구조를 가지고 부모 클래스의 메소드를 자식 클래스에서 오버라이딩 했을 때 부모클래스 타입으로 메소드 호출을 했을 때 자동으로 자식클래스의 메소드를 호출하는 것이다. 이는 매번 다운캐스팅을 통해 자식클래스의 메소드를 호출해야하는 번거로움을 줄여준다.
다형성은 동적 바인딩을 통해 동작한다. 변수 타입은 부모이지만, 실제 실행되는 메소드는 자식에 오버라이딩된 메소드가 실행되는 방식으로 구현되는 것이다. (동적바인딩)
class Shape {
String color;
// 생성자
public Shape(String color) {
this.color = color;
}
public void draw() {
System.out.println("도형을 그립니다. (색상: " + this.color + ")");
}
}
class Rectangle extends Shape {
int width;
int height;
// 생성자
public Rectangle(String color, int width, int height) {
// *주의: 생성자의 첫 줄에 있어야 함!
super(color);
this.width = width;
this.height = height;
}
// Overriding (다형성의 핵심: 부모의 draw를 재정의함)
@Override
public void draw() {
System.out.println("직사각형을 그립니다. 크기: " + width + "x" + height + ", 색상: " + super.color);
}
// 자식클래스의 고유 기능
public void calculateArea() {
System.out.println("넓이 계산: " + (width * height));
}
}
public class PolymorphismExam {
public static void main(String[] args) {
// 1. Upcasting (자동 형변환)
// 타입은 Shape(부모)지만, 실제 생성된 객체는 Rectangle(자식)
Shape s = new Rectangle("Blue", 10, 20);
// 2. 다형성 (Polymorphism) 확인
s.draw();
// 변수 s는 Shape 타입이라서 draw() 호출이 가능, 오버라이드 됐으므로 Rectangle의 draw가 실행됨
// 출력: 직사각형을 그립니다. 크기: 10x20, 색상: Blue
// 3. Downcasting의 필요성
// s.calculateArea(); // 에러! Shape 타입의 눈으로는 calculateArea가 안 보임.
if (s instanceof Rectangle) {
// Downcasting (강제 형변환): Rectangle 타입으로 레퍼런스해야 자식 고유 메소드 접근 가능
Rectangle r = (Rectangle) s;
r.calculateArea(); // 출력: 넓이 계산: 200
}
}
}
'프로젝트 > Java' 카테고리의 다른 글
| [Java] 6. 예외처리 (0) | 2026.02.06 |
|---|---|
| [Java] 5. 문자열 (String, StringBuilder, StringBuffer), 자바 표준 입출력 (0) | 2026.01.29 |
| [Java] 4. 추상 클래스, 인터페이스 (0) | 2026.01.28 |
| [Java] 3. Object 클래스 (toString, equals, hashCode, clone) (0) | 2026.01.28 |
| [Java] 1. JVM 메모리 구조 / static, final 키워드 (0) | 2026.01.14 |