본문 바로가기
Java/기본 개념 및 클래스

[Java] 47. 추상 클래스 활용: 클래스 구현하기

글: Song hyun 2024. 4. 24.
728x90
반응형

[Java] 추상 클래스 활용: 클래스 구현하기

위의 사진대로 추상 클래스와 메서드를 구현해보자.


1. 분석하기

(1) 위의 사진을 살펴보자. 자세히 보면 이탤릭체(기울어진 글씨체)인 클래스, 메서드 명이 있는 것을 알 수 있다.

이탤릭체로 표시된 클래스/변수는 추상화되었음을 의미한다. 

 

(2) 화살표는 상속을 의미한다. 가리켜지는 클래스가 부모 클래스이다.

--> 추상 클래스인 Computer를 상속받는 클래스 DeskTop/NoteBook(추상 클래스), 그리고 NoteBook 클래스를 다시 상속받는 MyNoteBook 클래스가 있음을 알 수 있다.

 

 

2. 클래스 파일 및 메서드 생성하기

(1) 우선 가장 먼저 상속하는 클래스인 Computer 클래스를 생성한다. 

이 때, 클래스 선언 부분에 abstract를 선언해 추상 클래스로 만든다.

 

(2) 이제 Computer 클래스를 상속받는 DeskTop/NoteBook 클래스를 생성한다.

 

(3) 구조도를 잘 보면, NoteBook 클래스만이 추상 클래스임을 알 수 있다. (이탤릭체 표기=추상 클래스)

NoteBook 클래스는 (1)과 같이 abstract를 사용해 추상 클래스로 만든다.

 

(4) DeskTop의 경우는 또 다른데, 추상 클래스를 상속받으면서도, 자식 클래스인 DeskTop은 추상화되지 않음을 알 수 있다. 이 경우에는 부모 클래스인 Computer 클래스의 메서드를 오버라이딩하면 해결된다.

 

(5) NoteBook 클래스를 상속받는 MyNoteBook 역시 마찬가지이다. 추상 클래스를 상속받지만, 자기 자신은 추상화되지 않은 일반 클래스이다. 똑같이 NoteBook 클래스의 메서드들을 오버라이딩하면 해결된다!

 

 


(1) 컴퓨터 클래스

package basic.ch21;
public abstract class Computer {
	private String name;
	
	public abstract void display();
	public abstract void typing();
	
	public void turnOn(){
	}
	public void turnOff() {
		
	}
}

 

(2) DeskTop 클래스

package basic.ch21;
import java.util.Scanner;
import java.util.Random;
public class DeskTop extends Computer {
	
	
	
	@Override
	public void turnOn() {
		System.out.println("데스크탑을 켭니다.");
	}
	@Override
	public void turnOff() {
		System.out.println("데스크탑을 끕니다.");
	}
	@Override
	public void display() {
		int mood=0;
		boolean flag=true;
		
		while(flag) {
			System.out.println("------------------");
			System.out.println("메뉴를 선택해주세요.");
			System.out.println("1. 인터넷 검색 | 2. 파일 구경하기");
			Scanner sc=new Scanner(System.in);
			Random random=new Random();
			int choice=sc.nextInt();
			
			if(mood>=2) {
				System.out.println("눈이 피곤하다. 잠시 쉬고 오자...");
				break;
			}
			if(choice==1) {
				System.out.println("당신은 인터넷 서핑을 했다.");
				int a=random.nextInt(2);
				if(a==0) {
					System.out.println("이상한 글을 봐서 기분이 안 좋아졌다...");
					mood++;
				}
				else {
					System.out.println("앗! 시간이 어느새 2시간이나 지나가버렸다.");
				}
			}
			else if(choice==2) {
				System.out.println("당신은 데스크 탑 속의 파일들을 구경했다.");
				int a=random.nextInt(2);
				if(a==0) {
					System.out.println("몇 년 전의 사진들을 보고 추억에 빠졌다.");
				}
				else {
					System.out.println("언제 이런 사진들이 찍힌 거야!");
					mood++;
				}
			}
			else {
				System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
			}
		}	
		}
		
	@Override
	public void typing() {
		System.out.println("오늘의 운세를 보시겠습니까?");
		System.out.println("1. 네 | 2. 아니오");
		Scanner sc=new Scanner(System.in);
		int a=sc.nextInt();
		if(a==1) {
			Random random=new Random();
			int aa=random.nextInt(3);
			if(aa==0) {
				System.out.println("운세는 대길! 아주 즐거운 하루가 될 것 같습니다.");
			}
			else if(aa==1) {
				System.out.println("운세는 소길! 소소한 행복을 기대해 보세요.");
			}
			else if(aa==2) {
				System.out.println("운세는 소흉! 사소한 실수가 잦을지도 모릅니다.");
			}
			else {
				System.out.println("운세는 대흉! 오늘은 되도록 휴식하는게 좋겠습니다.");
			}
		}
	}

}

 

(3) NoteBook 클래스

package basic.ch21;

public abstract class NoteBook extends Computer {
	
	public void typing() {
	}
}

 

(4) MyNoteBook 클래스

package basic.ch21;
import java.util.Scanner;
public class MyNoteBook extends NoteBook {
	Scanner sc=new Scanner(System.in);
	
	@Override
	public void display() {
		System.out.println("화면이 꺼져 있다.");
	}
	
	public void typing() {
		System.out.println("오늘의 일기를 써보자.");
		String diary=sc.nextLine();
		System.out.println("-----------------");
		System.out.println("----오늘의 일기----");
		System.out.println(diary);
		System.out.println("-----------------");
		System.out.println("내일도 힘차게!");
	}
}
728x90
반응형