해당 게시물에서는 개인적으로 자바에서 가장 어렵다고 생각하는 상속과 추상메서드에 대해서 설명해보겠다.
[상속 (extends)] : 다른 클래스가 가지고 있는 멤버들을 새로 작성하지 않고 가져와서 사용하는 문법으로, 부모클래스가 가진 필드, 메서드 그리고 타입을 물려준다. 그리고 자식 클래스는 그것을 받아서 자신 것처럼 사용한다.
일단 상속의 설명에서 부모/자식 클래스라는 키워드를 처음 접했다면 와닿지 않을 것이다.
아래 코드예제를 확인하면서 알아보자.
public class Animal() {
String name;
String age;
}
public class Dog() extends Animal {
}
public class Cat() extends Animal {
}
위에 코드를 확인해보면, Animal이라는 클래스 안에 이름과 나이에 대한 필드가 선언되어있고, Dog와 Cat 클래스에는 아무런 필드 없이 "extends" 상속 키워드로 Animal 클래스를 상속받으며 클래스가 선언되었다.
public void main() {
Dog dog = new Dog();
Cat cat = new Cat();
dog.name = "멍멍이";
dog.age = 3;
cat.name = "고양이";
cat.age = 4;
}
Animal로부터 상속을 받던 Dog와 Cat클래스를 통해서 객체를 각각 하나씩 만들어보았다.
이때 코드를 잘 확인해보면 Dog와 Cat 클래스에는 필드로 name과 age 필드가 존재하지 않았는데도 불구하고 각 객체에서 name, age필드에 값을 할당해주고 있다. 이는 Animal 클래스로부터 필드(name, age)를 상속받았기 때문에 사용이 가능하다.
다음과 같이 내가 여러가지 객체에 대해서 공통되는 부분을 방금전의 Animal 클래스처럼 사용하여 유지보수를 간소화 할 수 있다.
어느정도 느낌이 온다면 아래 추상메서드와 추상 클래스에 대해서 알아보자
[추상 메서드/클래스]
- abstract : 자식들이 공통적으로 가지게 되는 메서드를 부모 클래스에서 대신해서 선언해줄 수 있다. 자식들이 강제적으로 메서드를 생성해서 덮어줘야하는 조건을 주기위해 abstract 키워드를 포함해서 선언한다.
- Override : 해당 메서드를 선언 시 , 자식 메서드들은 무조건 해당 메서드와 동일한 형태/메서드명으로 선언을 각각 진행하여 덮어 씌운다. 이때 자식 클래스에서 메서드 위에 시스템을 위한 주석으로 @(어노테이션)Override 를 추가한다.
public class Animal() {
String name;
String age;
}
public class Dog() extends Animal {
private void move() {
~~~
}
}
public class Cat() extends Animal {
private void move() {
~~~
}
}
해당 클래스에서 강아지와 고양이 객체 모두 "움직인다"라는 메서드의 move() 메서드를 동일하게 가지고 있다. 그리고 공통적으로 무조건 가지고 있어야할 메서드라고 할 때 다음과 같이 코드를 작성할 수 있다.
public abstract class Animal() {
String name;
int age;
private abstract void move();
}
public class Dog() extends Animal {
@Override
void move() {
System.out.println("터벅터벅");
}
}
public class Cat() extends Animal {
@Override
void move() {
System.out.println("사뿐사뿐");
}
}
Animal로부터 상속받을 자식 클래스(Dog, Cat ...)들은 공통적으로 가져야할 필드 name, int 를 묶어주고 추가적으로 모든 자식 클래스에서 가져야 할 메서드 move() 메서드를 생성해주었다. Animal로부터 상속받는 자식클래스는 다음과 같이 abstract 키워드를 통해서 만든 추상메서드 move() 메서드를 무조건 재정의 해주어야하며, 다음과 같은 행위를 Override라고 부른다.
그리고 코드를 잘 살펴보았다면 추상이라는 키워드의 abstract 키워드가 move() 메서드에만 있지않고 Animal 클래스 명 옆에도 보인다. 추상메서드를 하나라도 사용하는 클래스는 무조건 abstract 키워드를 붙여 추상클래스로 정의되어야 한다. 추상클래스에서 move()와 같은 추상 메서드는 body가 존재하지 않으며, 당연히 추상클래스를 통한 객체는 생성될 수 없다.
[super()]
해당 메서드가 사용되는 클래스의 부모 클래스의 생성자 메서드를 대신하는 메서드이다.
super() : 부모 클래스의 디폴트 생성자
super(~,~,~) : 오버로딩된 부모클래스의 생성자
- 부모의 필드 name과 age에 자식클래스의 생성자로 접근하기 위해서 자식 클래스의 생성자 내에 super() 메서드를 통해서 값을 할당한다.
[interface]
추상 메서드만 다루는 클래스에 사용하는 키워드
'JAVA' 카테고리의 다른 글
| [JAVA] final / static 키워드 알아보기 (7) (1) | 2025.05.21 |
|---|---|
| [JAVA] 생성자 / 오버로딩 (6) (1) | 2025.05.20 |
| [JAVA] 클래스 / 객체 (5) (0) | 2025.05.20 |
| [JAVA] 배열(4) (0) | 2025.05.20 |
| [JAVA] 형변환 메서드(3) (1) | 2025.05.19 |