연습문제 2번

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package _0922_B;
 
public class Main {
 
    public static void main(String[] args) {
        
        //클래스를 생성할 때, Animal > Animal로 형변환(실제로는 하지 않음)
        Animal animal = new Animal();
        
        //클래스를 생성할 때, Dog(자식 객체)를 Amimal(부모 객체)로 형변환을 하여 생성한다.
        //실제 인스턴스는 Dog이지만, Animal로 취급
        Animal dog = new Dog();
        
        //클래스를 생성할 때, Cat(자식 객체)를 Animal(부모 객체)로 형변환을 하여 생성한다.
        //실제 인스턴스는 Cat이지만, Animal로 취급 
        Animal cat = new Cat();
        
        //실제 객체의 인스턴스는 각각 Animal, Dog, Cat이지만
        //위 생성자에서는 Animal로 """취급""" 한다.
        //실제 프로그램 내에서는 바인딩으로 인해 실제 인스턴스로 작동함
        
        //이런 상속관계간 형변환을 사용하는 이유는 최상위 클래스를 이용해 하나의 타입으로 만든 배열,리스트 등 Container을 이용하여
        //하나의 for문으로 접근 및 제어 할 수 있기 때문이다.
        speak(animal);
        speak(dog);
        speak(cat);
    }
    
    private static void speak(Animal target)
    {
        //Animal 클래스 내의 함수 Speak가 실행되지만
        //각 클래스의 실제 인스턴스인 자식의 함수로 오버라이딩 되어 실행되게 된다.
        target.Speak();
    }
}
cs

상속관계에서 상위 클래스로 형변환하여 하나의 메소드로 접근하고 실제로 가리키는 인스턴스의 객체로 바인딩을 통하여 함수를 호출하도록 하는 문제이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package _0922_B;
 
public class Animal 
{
    public void Speak()
    {
        System.out.println("Animal Speak");
    }
}
 
class Cat extends Animal
{
    public void Speak()
    {
        System.out.println("Meow");
    }
}
 
class Dog extends Animal
{
    public void Speak()
    {
        System.out.println("Woof");
    }
}
 
cs

 

 

 

 

연습문제 3번

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package _0922_C;
 
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        
        FriendInfoHandler handler = new FriendInfoHandler();
        
        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.print("선택>> ");
            Scanner sc = new Scanner(System.in);
            int choice = sc.nextInt();
 
            switch (choice) {
            case 1:
            case 2:
                handler.AddFriend(choice);
                break;
            case 3:
                handler.ShowAllData();
                break;
            case 4:
                handler.ShowAllSimpleData();
                break;
            case 5:
                System.out.println("프로그램을 종료합니다.");
                return;
            }
            
            System.out.println("");
        }
 
    }
 
}
 
cs

Main 함수가 있는곳. Handler을 생성하고 Handler에 접근하여 프로그램을 동작시킨다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package _0922_C;
 
import java.util.ArrayList;
import java.util.Scanner;
 
public class FriendInfoHandler {
    private ArrayList<HighFriend> mHighFriends;
    private ArrayList<UnivFriend> mUnivFriends;
 
    /// 생성자
    public FriendInfoHandler() {
        mHighFriends = new ArrayList<HighFriend>();
        mUnivFriends = new ArrayList<UnivFriend>();
    }
 
    /// Friend 추가
    public void AddFriend(int choice) {
        String name, phoneNum, addr, job, major;
        Scanner sc = new Scanner(System.in);
        System.out.print("이름 : ");
        name = sc.nextLine();
        System.out.print("전화 : ");
        phoneNum = sc.nextLine();
        System.out.print("주소 : ");
        addr = sc.nextLine();
 
        if (choice == 1) {
            System.out.print("직업 : ");
            job = sc.nextLine();
            mHighFriends.add(new HighFriend(name, phoneNum, addr, job));
 
        } else// if(choice==2)
        {
            System.out.print("학과 : ");
            major = sc.nextLine();
            mUnivFriends.add(new UnivFriend(name, phoneNum, addr, major));
        }
        System.out.println("입력 완료! \n");
    }
 
    public void ShowAllData() {
        for (int i = 0; i < mHighFriends.size(); ++i) {
            mHighFriends.get(i).ShowData();
        }
        
        System.out.println("");
        
        for (int i = 0; i < mUnivFriends.size(); ++i) {
            mUnivFriends.get(i).ShowData();
        }
    }
 
    public void ShowAllSimpleData() {
        for (int i = 0; i < mHighFriends.size(); ++i) {
            mHighFriends.get(i).ShowBasicInfo();
        }
        
        System.out.println("");
        
        for (int i = 0; i < mUnivFriends.size(); ++i) {
            mUnivFriends.get(i).ShowBasicInfo();
        }
    }
}
 
cs

상속관계를 이용하지 않고 여러 타입에 대해 접근, 제어하는 프로그램을 작성하는것이 이번 연습문제의 핵심.

상속관계를 이용함으로써 얻는 편리함을 이용하지 못하게하여 그 불편함을 느끼도록 하는 문제인듯 싶다.

각 타입에대해 개별적으로 반복문을 이용해 객체에 접근, 제어할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package _0922_C;
 
public class HighFriend {
    
    private String mName; //이름
    private String mPhoneNum; //전화번호
    private String mAddress; //주
    private String mWork; //직업
    
    public HighFriend(String name, String phoneNum, String address, String work)
    {
        this.mName = name;
        this.mPhoneNum = phoneNum;
        this.mAddress = address;
        this.mWork = work;
    }
    
    public void ShowData()
    {
        System.out.println("이름: " + mName);
        System.out.println("전화: " + mPhoneNum);
        System.out.println("주소: " + mAddress);
        System.out.println("직업: " + mWork);
    }
    
    public void ShowBasicInfo()
    {
        System.out.println("이름: " + mName);
        System.out.println("전화: " + mPhoneNum);
    }
}
 
cs

상속의 개념이 없기때문에 중복되는 속성의 멤버변수를 각 클래스마다 작성해줘야한다. 상당히 불편한 상태이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package _0922_C;
 
public class UnivFriend {
    
    private String mName; //이름
    private String mPhoneNum; //전화번호
    private String mAddress; //주
    private String mMajor; //전공
    
    public UnivFriend(String name, String phoneNum, String address, String major)
    {
        this.mName = name;
        this.mPhoneNum = phoneNum;
        this.mAddress = address;
        this.mMajor = major;
    }
    
    public void ShowData()
    {
        System.out.println("이름: " + mName);
        System.out.println("전화: " + mPhoneNum);
        System.out.println("주소: " + mAddress);
        System.out.println("전공: " + mMajor);
    }
    
    public void ShowBasicInfo()
    {
        System.out.println("이름: " + mName);
        System.out.println("전화: " + mPhoneNum);
        System.out.println("전공: " + mMajor);
    }
}
 
cs
bonnate