상속
class Car {
private int speed;
public Car(int speed) {
this.speed = speed;
}
public void printSpeed() {
System.out.println("Speed : " + this.speed);
}
}
class Volvo extends Car {
private String name;
public Volvo(String name, int speed) {
super(speed); // 슈퍼클래스의 생성자 호출
this.name = name;
}
@Override
public void printSpeed() {
super.printSpeed(); // 슈퍼클래스의 메소드 호출
System.out.println("Car name : " + this.name);
}
}
class Main {
public static void main(String[] args) {
Volvo car = new Volvo("volvo", 100);
car.printSpeed();
}
}
상속(Inheritance)은 하나의 클래스가 다른 클래스의 속성과 메드를 이어받는 기능을 말합니다. 상속은 코드 재사용성을 높이고, 프로그램의 구조를 체계적으로 관리할 수 있게 해주어 소프트웨어 개발의 생산성을 향상시키는 중요한 객체지향 프로그래밍의 특징 중 하나입니다.
상속의 기본 개념
- 슈퍼클래스 (Superclass): 상위 클래스, 또는 부모 클래스라고도 불리며, 다른 클래스에게 상속되는 속성과 메소드를 가진 클래스입니다.
- 서브클래스 (Subclass): 하위 클래스, 또는 자식 클래스라고도 하며, 슈퍼클래스의 속성과 메소드를 상속 받아 사용하거나 확장할 수 있는 클래스입니다.
상속 구현
래스 간의 상속은 extends 키워드를 사용하여 선언합니다. 메소드 오버라이딩(Overriding)은 서브클래스가 슈퍼클래스의 메드를 재정의하여 특정 기능을 자신에 맞게 변경하는 것을 말합니다.
상속의 제한
- 단일 상속: Java에서 클래스는 다중 상속을 지원하지 않습니다. 즉, 하나의 클래스는 오직 하나의 슈퍼클래스만 가질 수 있습니다. 인터페이스를 통해 다중 상속과 유사한 기능을 구현할 수는 있습니다.
- 접근 제한자: private 접근 제한자를 가진 필드나 메드는 서브클래스에서 직접 접근할 수 없습니다. 이러한 멤버는 protected나 public으로 선언되어야 상속을 통해 접근 가능합니다.
슈퍼 클래스로 묵시적 클래스 형 변환
class Car {
public void Carprint() {
System.out.println("Car");
}
}
class Volvo extends Car {
public void Volvoprint() {
System.out.println("Volvo");
}
}
class Main {
public static void main(String[] args) {
Car car = new Volvo();
car.Carprint();
// car.Volvoprint(); error
}
}
클래스 간의 형변환은 객체의 참조 형태를 변경하는 것을 의미합니다.
본적으로 두 가지 형태로 나뉩니다: 업캐스팅(Upcasting)과 다운캐스팅(Downcasting)입니다.
업캐스팅 (Upcasting)
Car car = new Volvo();
업캐스팅은 서브 클래스의 객체를 슈퍼 클래스 타입으로 변환하는 것입니다.
다운캐스팅 (Downcasting)
Volvo volvo = (Volvo) car;
다운캐스팅은 업캐스팅된 객체를 다시 원래의 서브 클래스 타입으로 변환하는 것을 말합니다. 다운캐스팅은 명시적으로 수행되어야 하며, 실행 시 객체의 실제 타입과 일치하지 않을 경우 ClassCastException을 발생시킬 수 있습니다.
클래스 형 변환을 하는 이유
메소드 오버라이딩
class Car {
public void printCar() {
System.out.println("Car");
}
}
class Volvo extends Car {
@Override
public void printCar() {
System.out.println("Volvo");
}
}
class Main {
public static void main(String[] args) {
Car car = new Car();
Car volvo = new Volvo();
car.printCar(); // 출력 : Car
volvo.printCar(); // 출력 : Volvo
}
}
메소드 오버라이딩(Method Overriding)은 서브클래스가 슈퍼클래스로부터 상속받은 메소드를 재정의하여 서브클래스에 맞게 동작을 수정하는 기능입니다
메소드 오버라이딩은 다형성의 핵심 요소입니다. 서로 다른 클래스의 객체들이 같은 메소드 호출에 대해 다르게 반응할 수 있게 함으로써, 더 일반적이고 유연한 코드를 작성할 수 있습니다.
다형성
class Car {
public void printCar() {
System.out.println("Car");
}
}
class Volvo extends Car {
@Override
public void printCar() {
System.out.println("Volvo");
}
}
class Bentz extends Car {
@Override
public void printCar() {
System.out.println("Bentz");
}
}
class Main {
public static void main(String[] args) {
Car car = new Car();
Car volvo = new Volvo();
Car bentz = new Bentz();
car.printCar(); // 출력 : Car
volvo.printCar(); // 출력 : Volvo
bentz.printCar(); // 출력 : Bentz
}
}
다형성(Polymorphism)은 객체 지향 프로그래밍의 핵심 개념 중 하나로, '많은 형태를 가질 수 있다'는 의미를 담고 있습니다.
자바에서 다형성은 하나의 객체가 여러 타입의 인스턴스로 행동할 수 있게 하며, 이는 코드의 재사용성과 유연성을 높여줍니다.
다형성의 주요 특징
- 메소드 오버라이딩 (Method Overriding): 서브 클래스에서 슈퍼 클래스의 메소드를 재정의하여 같은 메소드 호출에 대해 다른 행동을 하도록 하는 기능입니다. 이를 통해 실행 시간에 동적으로 메소드가 결정되는 '동적 바인딩'이 이루어집니다.
- 메소드 오버로딩 (Method Overloading): 같은 이름의 메드를 매개변수의 타입이나 개수를 다르게 하여 여러 버전으로 정의하는 기능입니다. 이는 컴파일 시간에 결정되는 '정적 바인딩'에 해당합니다.
- 인터페이스 (Interface): 서로 다른 클래스들이 동일한 인터페이스를 구현함으로써 동일한 방법으로 접근할 수 있게 하는 기능입니다. 이는 클래스가 인터페이스의 형태를 취할 수 있게 하여 다양한 구현을 가능하게 합니다.
결론 : 클래스를 형 변환하는 이유는 관리하기 편하게하고 다형성을 위해서 형 변환을 합니다.
Volvo[] volvo = new Volvo[];
volvo[0] = new Volvo();
volvo[1] = new Volvo();
Bentz[] bentz = new Bentz[];
bentz[0] = new Bentz();
bentz[1] = new Bentz();
형 변환을 하지 않으면 이런식으로 객체들을 관리해야 하는데
Car[] car = new Car[];
car[0] = new Volvo();
car[1] = new Volvo();
car[2] = new Bentz();
car[3] = new Bentz();
하나의 타입으로 묶어 배열을 구성할 수 있게 됩니다. 하나의 자료형으로 관리하니 코드가 간결해져 유지 보수성이 좋아집니다. 하지만 이러한 예시는 업캐스팅 방식으로 슈퍼 클래스를 오버라이딩 한 경우가 아니라면 서브 클래스의 메소드를 실행할 수 없어 이를 해결하기 위해서 다운 캐스팅을 사용합니다.
출처
W3Schools.com
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
www.w3schools.com
'Programming > Java' 카테고리의 다른 글
인터페이스와 추상 클래스 (0) | 2024.08.07 |
---|---|
자바 예외처리 (0) | 2024.08.06 |
배열 (0) | 2024.08.05 |
문자열 클래스 (0) | 2024.08.03 |
메소드 오버로딩(Method overloading) (0) | 2024.08.03 |