SQLD, ECLIPS, JAVA,PYTHON, NODE....

[Eclips] Java Class 6 - 상속구조, final, tostring 본문

Java

[Eclips] Java Class 6 - 상속구조, final, tostring

D_Aiden 2023. 12. 14. 21:00
728x90
반응형
SMALL

2023.12.14

##상속구조

- 하위클래스들이 상위클래스의 매소드(함수)들을 호출하기 편하게 하는 구조.

- 상위 클래스: 부모(Friend class) / 출력정보는 main에서만 가능
-하위 클래스: 자식(HighFriend class / Univers class)
-하위 클래스: 자식(FriendHandler)

(연습1) Friend로 상속구조 이해하기

package oop.friend;
public class Friend {             // 부모 클래스. 기본값을 입력헤두면, 자식클래스 사용되도록 구성
	String name, phoneNum, addr;
	public Friend(String name, String phone, String addr) {
		this.name = name;
		this.phoneNum = phone;
		this.addr = addr;
	}
// 전체 정보 출력
	public void showData() {
		System.out.print("이름 : " + name );
		System.out.print("전화번호 : " + phoneNum );
		System.out.print("주소 : " + addr );
	}
// 간단한 정보(이름/전화번호)만 출력
	public void showBasicInfo() {
	}
}

package oop.friend;
public class HighFriend extends Friend {	//자식2 클래스, 부모클래스 상속가능 --> 형태: extends 부모클래스명
	String job;								//major란 변수 생성
	public HighFriend(String name, String phone, String addr, String job) {   //현재 클래스명과 동일해야 됨
		super(name, phone, addr);   			//Friend(부모클래스) 변수호출. super란 메소드(함수) 사용
		this.job = job;							//UnivFriend클래스의 major를 사용하는 메소드(함수) this.을 사용
	}
	public void showData() {      				//(상속)부모클래스의 showData 사용
		super.showData();						//super로 부모클래스 모든 정보호출
		System.out.println("직업: " + job);  		//UnivFriend의 major 변수값을 호출
	}
	public void showBasicInfo() {            	//(상속)부모클래스의 showBasicInfo를 호출
		System.out.println("이름: " + name);   	//Friend(부모클래스)의 showBasicInfo를 호출
		System.out.println("전화: "+ phoneNum);
	}
}

package oop.friend;
public class UnivFriend extends Friend{    //자식2 클래스, 부모클래스 상속가능 --> 형태: extends 부모클래스명
	String major;                          //major란 변수 생성
	public UnivFriend(String name, String phone, String addr, String job) {   //현재 클래스명과 동일해야 됨
		super(name, phone, addr);    				//Friend(부모클래스) 변수호출. super란 메소드(함수) 사용
		this.major = major;				 			//UnivFriend클래스의 major를 사용하는 메소드(함수) this.을 사용
	}	
	public void showData() {        				//(상속)부모클래스의 showData 사용   
		super.showData();							//super로 부모클래스 모든 정보호출
		System.out.println("직업: " + major);  		//UnivFriend의 major 변수값을 호출
	}
	public void showBasicInfo() {					//(상속)부모클래스의 showBasicInfo를 호출
		System.out.println("이름: " + name);  		//Friend(부모클래스)의 showBasicInfo를 호출
		System.out.println("전화: "+ phoneNum); 		
	}
}

package oop.friend;
import java.util.Scanner;
public class MyFriendInfoBook {
	public static void main(String[] args) {
		FriendInfoHandler handler = new FriendInfoHandler(2);   //FriendInfoHandler의 2개를 handler란 변수에 담고
		while(true) {							//while문으로 true값을 확인해 출력
			System.out.println("메뉴선택");
			System.out.println("1. 고교친구 저장");
			System.out.println("2. 대학동기 저장");
			System.out.println("3. 주소록 전체정보 출력");
			System.out.println("4. 조소록 간단정보 출력");
			System.out.println("5. 프로그램 종료");
			System.out.println(">> 선택");

			Scanner sc=new Scanner(System.in);      //while문에 입력할 값을 키보드로 입력해야 되므로 키보드 생성
			int choice =sc.nextInt();				//키보드에 입력될 숫자를 choice란 변수에서 찾음
			
			switch(choice) {						//switch문으로 choice변수의 숫자로 구분 
			case 1 : case 2: handler.addFriend(choice); break; //1,2일때 FriendOfHandler의 addFriend에 선언된 handler의 choice변수에서 찾는 출력메소드(choice로 1개만 찾음)
			case 3 : handler.showAlldata(); break;	//3일째, FriendOfHandler의 showAlldate에 선언된 handler의 choice변수에서 찾는 출력메소드
			case 4 : handler.showSimpledata(); break; //4번째, FriendOfHandler의 showSimpledate에 선언된 handler의 choice변수에서 찾는 출력메소드
			case 5 :
				System.out.println("프로그램을 종료합니다.");
				return;			
			}
		}
	}
}

(문제2) 아이템으로 상속구조 구현하시오.

package oop.ItemEx;
//부모 클래스
public class Item {                  
	String itemNo, title, price;
	public Item(String itemNo, String title, String price) {
		this.itemNo = itemNo;
		this.title = title;
		this.price = price;
	}
//아이템 정보	
	public void ItemShow() {
		System.out.println("구매할 물건번호 입력하세요.: ");
		System.out.println("구매할 제목 : ");
		System.out.println("구매 가격 : ");
	}
// 아이템 기본이름
	public void ItemBasicName() {
	}
}

package oop.ItemEx;
//자식1 클래스
public class CD	extends Item {
	String cd;
	public CD(String itemNo, String title, String price, String singer, String trackNum, String outDate) {
		super(itemNo, title, price);
		this.cd=cd;
	}	
	public void ItemShow() {
		super.ItemShow();
		System.out.println("CD는" + cd);
	}	
	public void ItemBasicName() {	
		System.out.println("CD아이템번호 : "+ itemNo);
		System.out.println("CD제목 : "+ title);
		System.out.println("CD가격 : "+ price);
	}
}

package oop.ItemEx;
//자식2 클래스
public class DVD extends Item {
	String dvd;	
	public DVD(String itemNo, String title, String price, String actor, String runtime, String outDate1) {
		super(itemNo, title, price);
		this.dvd=dvd;
	}	
	public void ItemShow() {
		super.ItemShow();
		System.out.println("DVD는" +dvd);
	}	
	public void ItemBasicName() {	
		System.out.println("DVD아이템번호 : "  + itemNo);
		System.out.println("DVD제목 : " + title);
		System.out.println("DVD가격 : " + price);
	}
}

package oop.ItemEx;
//자식3 클래스
public class Book extends Item {
	String book;
	public Book(String itemNo, String title, String price, String name, String pageNum, String outDate2) {
		super(itemNo, title, price);
		this.book=book;
	}	
	public void ItemShow() {
		super.ItemShow();
		System.out.println("Book은" + book);
	}	
	public void ItemBasicName() {	
		System.out.println("Book번호: "+ itemNo);
		System.out.println("Book제목: "+ title);
		System.out.println("Book가격 : " + price);
	}
}

package oop.ItemEx;
//자식3 클래스(출력정보 입력 클래스)
import java.util.Scanner;
public class MainTest {
	public static void main(String[] args) {
		Handler handler888 = new Handler();     //Handler를 생성해 handler888변수에 담음
		handler888.ItemHandler(3);				//handler888로 하위에 변수호출
		while(true) {
			System.out.println("1.구매할 CD정보 입력하세요.: ");
			System.out.println("2.구매할 DVD정보 입력하세요.: ");
			System.out.println("3.구매할 Book정보 입력하세요.: ");
			System.out.println("4.구매목록을 출력합니다.");
			System.out.println("5.구매 프로그램을 종료합니다.");
			System.out.println(">>번호선택을 하세요.");
			
			Scanner sc=new Scanner(System.in);	//키보드객체 선언
			int buy = sc.nextInt();				//키보드객체를 buy로 변수선언(하위에 변수로 컨트롤 목적)
					
		switch(buy) {
		case 1 : case 2: case 3: handler888.addItem(buy); break;
		case 4 : handler888.showAllDate(); break;
		case 5 : 
			System.out.println("프로그램을 종료합니다.");
			return;	
		}
		}
	}

}
package oop.ItemEx;
//메도스(=함수)를 컨트롤 할 메소드
import java.util.Scanner;
public class Handler {
	private Item[] myItems;
	public int numOfItem;
	public void ItemHandler(int num) {
		myItems= new Item[num];
		numOfItem=0;
	}
	private void addItemInfo(Item I) {
		myItems[numOfItem++] = I;
	}
	public void addItem(int choice) {
		String singer, trackNum, outDate, actor, runtime, outDate1, name, pageNum, outDate2;
		Scanner scan= new Scanner(System.in);
		System.out.println("아이템 번호: "); String itemNo = scan.nextLine();
		System.out.println("아이템 제목: "); String title = scan.nextLine();
		System.out.println("아이템 가격: "); String price = scan.nextLine();
		if(choice==1) {
			System.out.println("CD가수명: "); singer=scan.nextLine();
			System.out.println("CD트렉번호: "); trackNum=scan.nextLine();
			System.out.println("CD발매일: "); outDate=scan.nextLine();
			addItemInfo(new CD(itemNo, title, price, singer, trackNum, outDate));
		} else if(choice==2) {
			System.out.println("DVD배우: ");actor=scan.nextLine();
			System.out.println("DVD런타임: "); runtime=scan.nextLine();
			System.out.println("DVD발매일: "); outDate1=scan.nextLine();
			addItemInfo(new DVD(itemNo, title, price,actor, runtime, outDate1));
		} else if(choice==3) {
			System.out.println("Book책이름: "); name=scan.nextLine();
			System.out.println("Book페이지수: "); pageNum=scan.nextLine();
			System.out.println("Book발간일: "); outDate2= scan.nextLine();
			addItemInfo(new Book(itemNo, title, price,name, pageNum, outDate2));
		}	
	}
	public void showAllDate() {
		for(int i=0; i<myItems.length; i++) {
			myItems[i].ItemBasicName();
		}
	}
}

결과

1.구매할 CD정보 입력하세요.: 
2.구매할 DVD정보 입력하세요.: 
3.구매할 Book정보 입력하세요.: 
4.구매목록을 출력합니다.
5.구매 프로그램을 종료합니다.
>>번호선택을 하세요.
1
아이템 번호: CDD
아이템 제목: DSDS
아이템 가격: 2000
CD가수명: 룰라
CD트렉번호: 3030
CD발매일: 2023.12.12
1.구매할 CD정보 입력하세요.: 
2.구매할 DVD정보 입력하세요.: 
3.구매할 Book정보 입력하세요.: 
4.구매목록을 출력합니다.
5.구매 프로그램을 종료합니다.
>>번호선택을 하세요.
2
아이템 번호: vdvdv
아이템 제목: sdsdsd
아이템 가격: dfqw
DVD배우: dqfq
DVD런타임: 200
DVD발매일: 2023.11.11
1.구매할 CD정보 입력하세요.: 
2.구매할 DVD정보 입력하세요.: 
3.구매할 Book정보 입력하세요.: 
4.구매목록을 출력합니다.
5.구매 프로그램을 종료합니다.
>>번호선택을 하세요.
3
아이템 번호: ddd
아이템 제목: fff
아이템 가격: 300
Book책이름: ddffg
Book페이지수: 300
Book발간일: 2023.12.33
1.구매할 CD정보 입력하세요.: 
2.구매할 DVD정보 입력하세요.: 
3.구매할 Book정보 입력하세요.: 
4.구매목록을 출력합니다.
5.구매 프로그램을 종료합니다.
>>번호선택을 하세요.
4
CD아이템번호 : CDD
CD제목 : DSDS
CD가격 : 2000
DVD아이템번호 : vdvdv
DVD제목 : sdsdsd
DVD가격 : dfqw
Book번호: ddd
Book제목: fff
Book가격 : 300
1.구매할 CD정보 입력하세요.: 
2.구매할 DVD정보 입력하세요.: 
3.구매할 Book정보 입력하세요.: 
4.구매목록을 출력합니다.
5.구매 프로그램을 종료합니다.
>>번호선택을 하세요.
5
프로그램을 종료합니다.

 

## 상속구조의 final

- final 사용하면, 상속이 제한(다른 클래스에서 상속이 안됨)되는 특성이 있음.
- final로 선언된 메소드는 하위클래스에서 재정의(overriding)할 수 없음 --> 보안설계에서 메소드 변형 방지 차원.

ex) final int max_value = 100; 
      max_value = 200; --> 에러: 값을 변경할 수 없음

 

class Parent {
    final void display() {
        System.out.println("부모 클래스의 display 메서드");
    }
}

class Child extends Parent {
     // void display() { }       // 주석 해제하면 에러 발생
}

class Parent {
    final void display() {
        System.out.println("부모 클래스의 display 메서드");
    }
}

class Child extends Parent {
    // void display() { }     // 주석을 해제하면 에러 발생
}

final class FinalClass {
    // class SubClass extends FinalClass { }      // 주석을 해제하면 에러 발생
}

 

## Object

최상위 부모클래스. 모든 클래스는 암시적, 명시적으로 object 클래스를 상속함.

- object의 중요한 메소드

1. tostring
- 객체를 문자열로 표현하는 메서드. 기본적으로는 객체의 클래스 이름과 해시 코드를 반환.

public class MyClass {
    public static void main(String[] args) {
        MyClass obj = new MyClass();
        System.out.println(obj.toString()); // MyClass@hashcode
    }
}

(연습1) GoodStock, GoodStockTest 2개의 클래스에서 확인

package oop.basic;
public class GoodsStock {
	String goodsCode;
	int stockNum;
	public GoodsStock(String goodsCode, int stockNum) {
		this.goodsCode = goodsCode;
		this.stockNum = stockNum;
	}
// String타입의 변수는 toString 메소드가 자동호출 됨
// toString 메소드 오버라이딩
	public String toString() {                  			// toString으로 오버라이딩하면 편하게 출력문 생성 가능.
		return "상품코드: " +goodsCode + ",재고수량" + stockNum; // String이므로 return 사용시 변수처럼 호출가능
	}
}
package oop.basic;
public class GoodsStockTest {
	public static void main(String[] args) {	
		GoodsStock goods = new GoodsStock("55555", 100);
		System.out.println(goods);

결과 (화면출력은 항상 main 클래스에서 실행)

상품코드: 55555,재고수량100

 

(연습2) MessageTest(부모), MessageSende, EmailSender, SNSsender 클래스로 메세지 호출

//부모
package oop.message;
public class MessageSender {      
	String title;
	String senderName;	
	public MessageSender(String title, String senderName) {
		this.title=title;
		this.senderName = senderName;
	}
	void sendMessage(String rec) {
	}
}

//자식1
package oop.message;
public class SNSsender extends MessageSender{
	String senderPhoneNo;  	//보내는 사람 번호 선언
	String message;			//보내는 사람 메세지 선언
	public SNSsender(String title, String senderName, String senderPhoneNo, String message) {
		super(title,senderName);         		//자식클래스는 변수선언 후, 반드시 부모클래스의 변수를 super()형태로 호출
		this.senderPhoneNo = senderPhoneNo;		//현재클래스의 변수를 선언
		this.message = message;					//현재클래스의 변수를 선언
	}
//보내는 정보출력 메소드
	void sendMessage(String rec) {
	System.out.println("---------------------");
	System.out.println("제목: "+title);
	System.out.println("보내는사람: " + senderName);
	System.out.println("전화번호: " + rec);     		// 수신번호
	System.out.println("회신번호: " + senderPhoneNo);
	System.out.println("메세지: " + message);
	}
}

//자식2
package oop.message;
public class EmailSender extends MessageSender{
	String emailAddr;  //보내는 사람 번호
	String emailBody;
	public EmailSender(String title, String senderName, String emailAddr, String emailBody) {
		super(title,senderName);		//자식클래스는 변수선언 후, 반드시 부모클래스의 변수를 super()형태로 호출
		this.emailAddr = emailAddr;		//현재클래스의 변수를 선언
		this.emailBody = emailBody;		//현재클래스의 변수를 선언
	}
	void sendMessage(String rec) {   	
	System.out.println("---------------------");
	System.out.println("제목: "+title);
	System.out.println("보내는사람: " + senderName + "이메일주소: " + emailAddr);
	System.out.println("전화번호: " + rec);     		// 수신번호
	System.out.println("회신번호: " + emailBody);
	}
}

// 호출문
package oop.message;
public class MessageTest {
	public static void main(String[] args) {
		SNSsender obj1 = new SNSsender("생일을 축하합니다.", "고객센터", "1588-1588","10% 할인쿠폰 제공합니다." );
		EmailSender obj2 = new EmailSender("생일을 축하합니다.","고객센터", "ddq@ddd.com","10% 할인쿠폰");
		obj1.sendMessage("010-100-0101");
		obj2.sendMessage("dafhk@naver.com");
		obj1.sendMessage("010-121-1212");
	}
}

결과

---------------------
제목: 생일을 축하합니다.
보내는사람: 고객센터
전화번호: 010-100-0101
회신번호: 1588-1588
메세지: 10% 할인쿠폰 제공합니다.
---------------------
제목: 생일을 축하합니다.
보내는사람: 고객센터이메일주소: ddq@ddd.com
전화번호: dafhk@naver.com
회신번호: 10% 할인쿠폰
---------------------
제목: 생일을 축하합니다.
보내는사람: 고객센터
전화번호: 010-121-1212
회신번호: 1588-1588
메세지: 10% 할인쿠폰 제공합니다.
728x90
반응형
LIST