자바/자바 코드 예제 만들기

자바 기초 예제문제 5. 상속 기반으로 인맥 관리 프로그램 관리 대상 묶기

Tomitom 2022. 10. 31. 10:36
반응형

 

대학 동창과 직장동료의 이름, 전공(부서), 전화번호 정보를 저장하고 관리하는 프로그램을 만들 때 

상속을 기반으로 중복되는 클래스 메소드들을 클래스 상속관계로 묶는 것을 예제로 만들어보겠습니다. 

 

ex) 

이름 : ㅇㅇㅇ

전공 : ㅇㅇㅇㅇㅇ

전화 : 000 - 0000 - 0000

 

이름 : ㅇㅇㅇ

부서 : ㅇㅇㅇㅇ

전화 : 000 - 0000 - 0000

 

우선 처음은 단순하게 관리 대상이 둘 이므로 두 개의 클래스를 정의하는 것부터 해볼게요. 

먼저 대학 동창 목록을 정의하는 클래스입니다. 

class UnivFriend{		// 대학 동창 목록
	private String name;		// 이름 문자열 선언 
	private String major; 		// 전공 문자열 선언
	private String phone; 		// 전화번호 문자열 선언
	
	public UnivFriend(String na, String ma, String ph) {
		name = na;
		major = ma; 
		phone = ph; 
	}
	public void showInfo() {
		System.out.println("이름 : " + name);
		System.out.println("전공 : " + major);
		System.out.println("전화 : " + phone);}
}

그 다음 회사 동료를 정의하는 클래스를  만들게요. 

여기에서 showInfo()를 오버 라이딩 합니다. 

class CompFriend{
	private String name; 		// 이름 문자열 선언
	private String depatment;	// 전공 문자열 선언
	private String phone;		// 전화번호 문자열 선언
	
	public CompFriend (String na, String de, String ph) {
		name = na; 
		department = de; 
		phone = ph; 
	}
	
	public void showInfo() {
		System.out.println("이름 : " + name);
		System.out.println("전공 : " + department);
		System.out.println("전화 : " + phone);}
}

정보를 저장하는 공간을 만들기 위해 배열을 정의해줍니다.

여기에서도 showInfo()를 오버 라이딩 합니다. 

 

		UnivFriend[] ufrns = new UnivFriend[5];	// 5칸의 대학동창 ufrns 배열 생성 
		int unct = 0; 
		
		CompFriend[] cfrns = new CompFriend[5]; 	// 5칸의 직장동료 cfrns 배열 생성 
		int ccnt = 0;

배열 안에 차례차례 순서대로 대학과 직장의 목록에 값을 초기화합니다. 

 

		ufrns[unct++] = new UnivFriend("LEE", "COMPUTER","010-1234-1234");	
		ufrns[unct++] = new UnivFriend("PARK", "ELCTRONICS","010-4564-4564");
		//unct 인수에 차례대로 숫자를 더해 배열에 순차적으로 값이 들어가게 선언한다. 
		
		cfrns[ccnt++] = new CompFriend("YOON", "R&D1","010-6262-6262");	
		cfrns[ccnt++] = new CompFriend("ANN", "R&D2","010-5656-5656");

이제 각 배열에 칸마다 들어있는 값들을 showInfo 메소드를 사용해서 순차적으로 출력합니다. 

 

		for(int i = 0 ; i < unct; i++ ) {
			ufrns[i].showInfo(); 
			System.out.println(); 
		}	// ufrns의 배열에 초기화된 값을 순차적으로 showInfo 메소드로 출력합니다.
		
		for(int i = 0 ; i < ccnt; i++ ) {
			ufrns[i].showInfo(); 
			System.out.println(); 
		}

출력값

이렇게 만들 경우 각 목록마다 코드배열이 겹쳐지는 것이 많기 때문에 코드를 절약하기 위해서 상속 관계로 묶는 방법을 생각해볼 수 있습니다. 그럼 두 클래스를 상속 관계로 묶어볼게요. 

 


우선 동창과 직장동료 둘 다 항목이 같은 이름과 전화번호를 정의합니다. 

연관된 일련의 클래스들에 대해 공통적인 규칙을 정의할 수 있어요. 

 

 

class Friend {
   protected String name;
   protected String phone;
   
   public Friend(String na, String ph) {
      name = na;
      phone = ph;
   }
   public void showInfo() {
      System.out.println("이름: " + name);
      System.out.println("전화: " + phone);
   }
}

 

공통적으로 중복되는 클래스를 super을 통해서 받고 그 아래의 자식 클래스로 직장동료의 부서를 추가합니다. 

 

class CompFriend extends Friend {
	   private String department;

	   public CompFriend(String na, String de, String ph) {
	      super(na, ph);
	      department = de;
	   }
	   public void showInfo() {
	      super.showInfo();
	      System.out.println("부서: " + department);
	   }
	}

그 다음에는 동창들의 목록을 위해 똑같이 부모 클래스인 Friend 클래스에서 super 키워드로 메소드를 상속 받아 전공 출력을 추가합니다. 

 

class UnivFriend extends Friend {
   private String major;

   public UnivFriend(String na, String ma, String ph) {
      super(na, ph);
      major = ma;
   }
   public void showInfo() {
      super.showInfo();
      System.out.println("전공: " + major);
   }
}

이제 메인 클래스에서 출력을 준비합니다. 

아까의 예제에서 동창과 직장동료의 배열을 각각 5개씩 준비했다면, 이번에는 동창과 직장동료를 모두 한 배열에 담기 위해 부모 클래스인 Friend  클래스에 10개의 배열을 준비합니다.  (비어있는 참조변수 10개를 만든 것과 같은 것) 

0부터 9까지의 인덱스가 만들어집니다.  

 

		   Friend[] frns = new Friend[10];
		   int cnt = 0;

 

그 다음, 배열에 각각 super 키워드로 상위 부모 클래스를 참조한 자식 클래스의 자료를 해당 배열에 쏙쏙 넣어줍니다. 

new UnivFriend 할 때마다 한 칸씩 데이터가 추가 됩니다. cnt++ 이므로 먼저 배열에 접근한 이후에 1을 다시 추가하는 것입니다.

 

 		frns[cnt++] = new UnivFriend("LEE", "Computer", "010-333-555");
		   frns[cnt++] = new UnivFriend("SEO", "Electronics", "010-222-444");
		   frns[cnt++] = new CompFriend("YOON", "R&D 1", "02-123-999");
		   frns[cnt++] = new CompFriend("PARK", "R&D 2", "02-321-777");

 

그리고 이제 모든 동창과 동료의 정도 전체를  for문을 통해 출력합니다. 

 

		for(int i = 0; i < cnt; i++) {
		      frns[i].showInfo();      // 오버라이딩 한 메소드가 호출된다.
		      System.out.println();

 

 

여기까지 메소드 오버라이딩과 상속을 이용한 코드의 변형을 살펴보았습니다.

다음번에 또 다른 예제로 확인해볼게요.

반응형