-
(5주차 32일) 상속, 다형성, 추상 클래스수업 내용 정리 2024. 6. 12. 17:42
Java
상속(Inheritance)
> 상속
- 객체 지향 프로그래밍에서 상속은 부모 클래스의 멤버를 자식 클래스에게 물려주는 것
- 부모 클래스: 부모에 해당하는 클래스. 상위, 슈퍼 클래스
- 자식 클래스: 자식에 해당하는 클래스. 하위, 서브 클래스
- 상속을 통해서 다른 클래스가 가지고 있는 멤버를 직접 만들지 않고 상속을 받음으로써 자신의 멤버처럼 사용할 수 있다.
- 선언: [접근 제한자] class 자식클래스명 extends 부모클래스명 { ... }
- 자바는 다중 상속을 지원하지 않는다.
- 모든 클래스는 Object 클래스의 후손이다.
- 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속에서 제외된다.
> 자식 객체 생성
- 생성자는 상속되지 않는다.
- 자식 클래스의 객체를 생성하면 -> 부모 클래스의 생성자가 먼저 호출되면서 ->
부모 객체가 생성되고 -> 자식 객체가 생성된다.
- super(): 자식 클래스의 생성자 안에서 부모 클래스의 생성자 호출
- super(): 자식 클래스의 생성자 첫 줄에 위치하여야 함
// 부모 클래스 public class Animal { private String name; private String kinds; public Animal() { } public Animal(String name, String kinds) { this.name = name; this.kinds = kinds; } } // 자식 클래스 public class Dog extends Animal { private int weight; public Dog() { // super() 생략 시 자동으로 생성한다. } public Dog(String name, String kinds, int weight) { super(name, kinds); this.weight = weight; } }
> 메소드 오버라이딩(Overriding)
- 메소드 오버라이딩: 부모 클래스의 메소드를 자식 클래스에서 재정의하여 사용하는 것
- @Override 애노테이션을 붙여 준다.
- 자식 클래스에서 메소드 오버라이딩은 부모의 메소드와 동일한 선언부를 가져야 한다.
- 부모 클래스의 메소드가 private 접근 제한을 가지면 자식 클래스는 메소드를 오버라이딩 할 수 없다.
- 자식 객체에서 오버라이딩된 메소드를 호출하면 부모 객체의 메소드가 아닌 오버라이딩된 자식 메소드가 호출된다.
- 부모 객체의 메소드는 삭제되는 것이 아닌 오버라이딩된 메소드에 의해 가려지게 된다.
- 자식 클래스 내부에서 오버라이딩된 부모 클래스의 메소드를 호출해야 하는 상황이 발생한다면
super를 통해서 부모 메소드를 호출할 수 있다.
// 부모 클래스 public class Animal { private String name; private String kinds; // 생성자 선언 ... public String bark() { return "짖는다."; } } // 자식 클래스 - 1 public class Dog extends Animal { private int weight; //생성자 선언 ... //@Override //public String bark() { // return "멍멍~ 짖는다."; //} @Override public String bark2() { return "멍멍~ " + super.bark(); } } }
- Object 클래스: 모든 클래스의 상위 클래스로, 기본적으로 Object 클래스를 상속
- toString() 메소드
- toString() 메소드는 객체의 문자 정보를 리턴한다.
- 기본적으로 Object 클래스에서는 "클래스명@16진수 해시코드"를 리턴한다.
- 자식 클래스에서 객체에 대한 유용한 문자열 정보를 리턴하도록 재정의할 수 있다.
- equals() 메소드
- equals() 메소드는 매개값으로 전달받은 객체와 자신이 동일한 객체라면 true를 리턴하고, 그렇지 않으면 false를 리턴한다.
- 기본적으로 Object 클래스에서는 주소값을 비교하는데 자식 클래스에서 객체들이 가지고 있는 필드의 값들을 비교하도록 재정의할 수 있다.
- hashCode() 메소드
- 객체의 해시 코드란 객체를 식별할 수 있는 하나의 정수값을 의미한다.
- 기본적으로 객체의 메모리 번지를 이용해서 만들어주기 때문에, 객체마다 다른 값을 가지고 있다.
* String 클래스에서 같은 문자열일 경우 해당 문자열의 hashCode는 같도록 이미 재정의되어 있다. - 컬렉션들은 hashCode() 메소드를 가지고 두 객체가 동등한지 비교하고, 해시 코드값이 같으면 equals() 메소드로 다시 비교한다.
- toString() 메소드
> final 클래스, final 메소드
- final 키워드는 필드뿐만 아니라 클래스와 메소드 선언 시에 사용할 수 있다.
- final 키워드를 클래스 선언에 붙이게 되면 이 클래스는 상속할 수 없는 클래스가 된다.
(e.g. java.lang에서 제공하는 String 클래스) - final 키워드를 메소드 선언에 붙이게 되면 이 메소드는 재정의할 수 없는 메소드가 된다.
(e.g. java.lang에서 제공하는 Object 클래스)
- final 키워드를 클래스 선언에 붙이게 되면 이 클래스는 상속할 수 없는 클래스가 된다.
다형성(Polymorphism)
> 다형성
- 다형성: 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
- 부모 클래스 타입의 참조 변수에 자식 객체들을 대입하여 다룰 수 있는 것
> 업 캐스팅(Up Casting)
- 자식 타입의 객체가 부모 타입의 객체로 형 변환되는 것
- 자동으로 형 변환이 일어나기 때문에 부모 클래스 타입의 참조 변수가 모든 자식 객체들을 별도의 형 변환 없이 대입 받을 수 있다.
- 부모 타입으로 업 캐스팅된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근 가능
단, 부모 타입의 메소드가 오버라이딩되었다면 오버라이딩된 메소드가 대신 호출된다.
> 다운 캐스팅(Down Casting)
- 부모 타입의 객체가 자식 타입의 객체로 형 변환되는 것
- 자동으로 형 변환이 일어나지 않기 때문에 형 변환 연산자를 사용해서 형 변환을 해야 한다.
- 부모 클래스 타입 참조 변수가 실제로 참조하는 객체를 확인하지 않고 강제 형 변환을 시도하면 ClassCastException 예외가 발생할 수 있다.
- 객체가 어떤 클래스의 인스턴스인지 instanceof 연산자를 사용해서 확인할 수 있다.
추상 클래스(Abstract Class)
> 추상 클래스
- 추상 클래스: 클래스들의 공통적인 특성을 추출해서 선언한 클래스
- 추상 클래스를 부모 타입으로, 객체로 생성될 실체 클래스가 자식 타입으로 구현되어
추상 클래스의 모든 특성을 물려받을 수 있다. - 추상 클래스는 공통되는 필드와 메소드를 추출해서 만들었기 때문에 객체를 직접 생성해서 사용할 수 없고
부모 클래스로만 사용된다.
- 추상 클래스를 부모 타입으로, 객체로 생성될 실체 클래스가 자식 타입으로 구현되어
- 선언: [접근 제한자] abstract class 클래스명 { ... }
- 필드, 메소드, 생성자를 포함할 수 있다.
- 객체로 생성이 안되지만 참조 변수의 타입으로는 사용이 가능하다.
> 추상 메소드(Abstract Method)
- 추상 메소드: 추상 클래스에서 선언할 수 있고 메소드의 선언부만 있는 메소드의 실행 내용인 중괄호({})가 없는 메소드이다.
- 추상 클래스에 선언된 메소드가 자식 클래스마다 실행 내용이 달라야 하는 경우 추상 메소드를 선언한다.
- 추상 클래스를 상속하는 자식 클래스는 반드시 추상 메소드를 오버라이딩 해야 한다.
오버라이딩하지 않으면 컴파일 에러가 발생하는데 자식 클래스에서 내용을 채우도록 강제화한다.
- 선언: [접근 제한자] abstract 반환형 메소드명([매개변수]);
'수업 내용 정리' 카테고리의 다른 글
(6주차 37일) IO 스트림 (0) 2024.06.17 (5주차 33일) 인터페이스, 예외 처리, 기본 API (0) 2024.06.13 (5주차 31일) 접근 제한자, 생성자, 메소드, 정적 멤버, final (0) 2024.06.11 (5주차 30일) 배열, 클래스, 필드 (0) 2024.06.10 (4주차 26일) 제어문 실습(조건문, 반복문, 분기문) (0) 2024.06.08 - 객체 지향 프로그래밍에서 상속은 부모 클래스의 멤버를 자식 클래스에게 물려주는 것