JAVA

[JAVA] 상속 / 추상메서드 (8)

jongh0 2025. 5. 22. 18:23

해당 게시물에서는 개인적으로 자바에서 가장 어렵다고 생각하는 상속과 추상메서드에 대해서 설명해보겠다.

 

[상속 (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