본문 바로가기
Study/중앙정보처리학원과정

14일차. 추상클래스, 추상메서드(abstract class, abstract method)

by 얏옹이 2022. 11. 11.
반응형

 

 

 

펌: 위키사전

 

"공통점을 파악하고 추려내는것" 

 

우리는 지금 상속과 다형성을 배우면서 상위/하위클래스와 클래스 타입간의 형변환 등등을 배우고있다.

 

오늘은 Class를 설계하는데 있어서 가장 첫번째 단계인 추상(abstract) 에 대해서 정리해보려고 한다.

 

"기계" 라는건 수많은 기기들을 이야기한다. 추상적인개념이다.

 

그 기계 밑에는 전자기기도 있을수있고, 산업기기도 있을수있고, 또 전자기기 밑에는 컴퓨터,스마트폰,프린터 등등..이 포함될수 있다.

 

그래서 "기계"라는 클래스를 추상클래스로 선언하고, 그 추상클래스에는 하위 분류들의 "공통분모" 들을 넣어주고

 

상속(Extends) 하고, 그 밑에 실체 클래스에는 좀더 세분화된 기능, 추가적인 기능을 부여할수 있다.

 

그럼 왜? 추상클래스를 이용하여 상속을하는가?

 

실체클래스를 구현하는 사람이 여러명일경우(협업, 팀프로젝트) 각각 작성하는 클래스에는 각기다른 필드명, 메서드명이 작성될것이다.

 

동일한기능, 동일한 값인데도 불구하고 각자 다른 필드명, 메서드명을 입력해놓으니 그것을 합쳤을때는 사용방법이 달라질수도있고 설명해주는 시간이 필요해진다.

 

그래서 실체클래스를 작성하는 시간을 줄여주기 위해서 추상클래스 선언을 설계하는 과정이 필요한것이다.

 

추상클래스를 선언하는것은 간단하다

 

클래스를 생성할때 [접근제한자] [제어자] [타입] [클래스명] 으로 작성하게되는데

 

제어자부분에 abstract 을 부여해주면된다. "기계" 클래스를 생성한다고 하면

 

public abstract class Machine { } 으로 부여해주면, 이건 바로 추상클래스임을 의미한다.

 

수업받을때 작성한 Person Class를 이용하여 예를 들어보겠다.

 

 

abstract 제어자가 붙었다. Person01_1111 은 추상클래스가 되었다.

 

추상클래스의 특징이 있는데..

 

먼저 추상클래스는 단독으로 객체 생성이 불가능하다, 그래서 상속을 통한 하위클래스의 객체 생성을 통해 우회적으로 객체 생성을 해야한다.

 

Person01_1111 person = new Person01_1111(); 이라는 명령어로 기본생성자를 호출하여 객체를 단독으로 생성할수 없다는말이다.

 

근데 그럼 기본생성자에 출력은 왜 넣어놨냐? 라고 물어보실수 있는데 Main Method에서 테스트할겸 넣어놨다.

 

추상클래스는 일반적인 메서드도 입력이 가능하고, 메서드의 이름은 같지만, 하위클래스에서 각각 다른 결과값이 나오게

Override를 해줄 공통적인 메서드도 입력이 가능한데, 메서드에도 abstract 을 입력해줘 추상메서드화 할수 있다.

 

추상메서드 선언은 {}를 작성하지않는다, 이를 선언부 라고 하는데 실행은 실체 클래스에서 각 실체 클래스 특징에 맞게 Override 된 내용들이 출력되는거니 추상 메서드는 뭔가 동작을 선언해주지않고 (); 로 마무리한다.

 

만약 추상메서드를 선언해주었다면, 꼭 실체클래스에서 반드시 해당 메소드를 재정의(Override)를 해줘야만 한다. 이는법칙이다.

 

만약 추상메서드를 추상클래스에서 선언하고, 실체클래스에서 이 메서드를 재정의해주지않는다면

 

The type Student01 must implement the inherited abstract method Person01_1111.study() 이라는 오류를 만나게된다.

 

다음은 Person을 상속받은 Student 클래스 작성이다.

 

 

Student 클래스는 Person 클래스를 상속받았고,  Sudent 클래스만 가지고있는 특징을 play() 메서드를 추가해줬다.

 

그리고 Person 클래스에서 추상메서드였던 study() 메서드를 Student 클래스에서 Override 재정의 해주었다.

 

다음은 실행클래스이다.

 

 

 

상속받은 자식클래스만 선언해주었는데... 음? 기본생성자가 생성되었다고 출력이 되었다.

 

이는 기본적으로 상속받은 자식클래스가 객체생성할때 내부적으로 super(); 가 선언되어서 상위클래스도 자동적으로 선언된다고 한다. 순서는 super()가 먼저 실행되어서 상위클래스의 기본생성자가 선언되고, 그리고 자식클래스의 생성자가 호출이 된다.

 

instanceof는 참조변수가 해당 클래스의 객체를 가지고 있는지를 체크한다.

여기서 s 라는 참조변수가 Student01 클래스의 객체를 가지고 있는지 if문으로검증후에

true나 false를 리턴해준다. true일경우에는 정상적으로 메서드가 실행되는지 테스트해주었고, 아닐경우 다시한번 s변수에 새롭게 new Student01(); 로 객체 생성을 해주었다.

 

instanceof는 클래스간의 형변환때 if문과 함께 주로 이용된다. 꼭 사용법을 숙지해두자!

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형