본문 바로가기

Java

[Java] 객체지향(2) 연습 정리

 

회원이 대여한 비디오 출력 예제(캡슐화)

 

Video.java

public class Video {

//video 관련 멤버변수
private String num;
private String title;
private String actor;

//디폴트 생성자
public Video() {} 

public Video(String num, String title, String actor) {
    this.num = num;   //this는 클래스 자기 자신을 가르킨다.
    this.title = title; //지역변수를 멤버변수에 대입
    this.actor = actor;
}
     //getter, setter 메서드
     public String getNum() {
         return num;
    }
    public void setNum(String num) {
        this.num = num;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
       public String getActor() {
        return actor;
    }
    public void setActor(String actor) {
        this.actor = actor;
    }
}
  • 캡슐화는 클래스 내 중요한 데이터(변수)나 기능을 외부로부터 접근하지 못하도록 한다.
  • 변수 앞에 자신의 클래스에서만 접근할 수 있는 접근제어자 private을 붙여준다.
  • get/set 메서드를 통한 접근으로 변수에 값을 넣고 뺄 수 있도록 한다.

 

GeneralMember.java

public class GeneralMember {
//회원 관련 멤버변수
private String id , name, address;    
private Video rentalVideo; //객체간 상호관계

public GeneralMember() {} //디폴트 생성자    
public GeneralMember(String id, String name, String address) {
    this.id = id;
    this.name = name;
    this.address = address;
}    
public void printMember() {
    System.out.println("회원의 아이디 : " + id);
    System.out.println("회원의 이름 : " + name);
    System.out.println("회원의 주소 : " + address);
    System.out.println("회원이 대여한 비디오 번호 : " + rentalVideo.getNum());
    System.out.println("회원이 대여한 비디오 제목 : " + rentalVideo.getTitle());
    System.out.println("회원이 대여한 비디오 배우 : " + rentalVideo.getActor());
}

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public Video getRentalVideo() {
        return rentalVideo;
    }
    public void setRentalVideo(Video rentalVideo) {
        this.rentalVideo = rentalVideo;
    }    
}
  • Video 클래스 타입의 참조변수 rentalVideo를 선언하여 객체 간의 상호관계를 맺어준다.
  • get 메서드를 통해 Video 객체에 데이터를 가져온다.

 

VideoMain.java

    public class VideoMain {
    public static void main(String[] args) {
         Video v1 = new Video("1", "반도", "강동원");
         Video v2 = new Video("2", "나는 살아있다.", "유아인");

         GeneralMember gm = new GeneralMember("aaa", "홍길동", "서울");

         gm.setRentalVideo(v2);

         gm.printMember();
    }
}

  • Video 객체 생성 후 초기화, GeneralMember 객체 생성 후 초기화
  • 참조 변수 gm에 set()를 이용하여 Video객체에 저장된 데이터를 넣는다.
  • printMember()에 작성한 get()가 호출되어 비디오에 대한 정보가 출력된다.

 

전화번호부 추가, 출력, 검색, 수정, 삭제 기능 구현

 

PhoneInfo.java

    public class PhoneInfo {
    //상태 : 이름, 전화번호, 생년월일
    //기능 : 1인 전화내역 출력기능, 
    private String name;
    private String phoneNo;
    private String birth;

    public PhoneInfo() {}

    public PhoneInfo(String name, String phoneNo, String birth) {
        this.name = name;
        this.phoneNo = phoneNo;
        this.birth = birth;
    }

    public void show() {
        System.out.println("이름 : " + name);
        System.out.println("전화번호 : " + phoneNo);
        System.out.println("생년월일 : " + birth);
    }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getPhoneNo() {
            return phoneNo;
        }

        public void setPhoneNo(String phoneNo) {
            this.phoneNo = phoneNo;
        }

        public String getBirth() {
            return birth;
        }

        public void setBirth(String birth) {
            this.birth = birth;
        }
    }
  • 멤버변수, 생성자, set/get 메서드
  • 출력과 검색에 사용할 show() 메서드

 

Manager.java

import java.util.Scanner;

public class Manager {

PhoneInfo arr[];
Scanner sc = new Scanner(System.in);

private String name = "";
private int count = 0;

public Manager() {
    arr = new PhoneInfo[10]; // 객체생성과 동시에 배열 초기화
}

public void addPhoneInfor() {
    // 이름, 전화번호, 생년월일 입력
    System.out.println("이름 : ");
    String name = sc.nextLine();
    System.out.println("전화번호 : ");
    String phoneNo = sc.nextLine();
    System.out.println("생년월일 : ");
    String birth = sc.nextLine();
    // PhoneInfo 객체 생성
    // 배열에 추가 => 객체가 생성될 때마다 count 증가
    arr[count++] = new PhoneInfo(name, phoneNo, birth);
}

public void listPhoneInfo() {
    // 배열에 있는 모든 PhoneInfo 객체를 출력
    // 현재 배열 안에 객체의 개수인 count만큼 for문을 수행.
    for (int i = 0; i < count; i++) {
        arr[i].show();
    }
}

public void searchPhoneInfo() {
    // 이름을 기준으로 검색
    System.out.println("이름 : ");
    String name = sc.nextLine();
    int idx = -1;

    for (int i = 0; i < count; i++) {
        PhoneInfo info = arr[i];
        if (name.equals(info.getName())) {
            info.show();
            idx = i;
        }
    }
    if (idx == -1) {
        System.out.println("찾을 수 없습니다.");
    }
}

public void updatePhoneInfo() {
    System.out.println("이름 : ");
    String name = sc.nextLine();
    int idx = -1;

    for (int i = 0; i < count; i++) {
        PhoneInfo info = arr[i];
        if (name.equals(info.getName())) {
            System.out.println("수정  전화번호 입력 : ");
            String phoneNo = sc.nextLine();
            info.setPhoneNo(phoneNo);
            System.out.println("수정 생년월일 입력 : ");
            String birth = sc.nextLine();
            info.setBirth(birth);

            idx = i;
            break;
        }
    }
}

public void deletePhoneInfo() {
        System.out.println("이름 : ");
        String name = sc.nextLine();
        int idx = -1;

        for (int i = 0; i < count; i++) {
            PhoneInfo info = arr[i];
            if (name.equals(info.getName())) {
                idx = i;
            }            
        }
        for(int i = idx; i < count -1; i++) {
            arr[i] = arr[i + 1];
        }
        count = count -1;
  }
}
  • 객체를 담을 배열 선언 및 생성
  • 배열 안에 객체의 수를 파악하기 위해 count 변수를 선언
  • addPhoneInfo()에서 PhoneInfo 객체가 생성될 때마다 count가 1씩 증가한다. (count++)
  • deletePhoneInfo() 삭제할 객체의 인덱스 위치를 구하고 뒤에 있는 인덱스를 하나씩 앞으로 밀어준다.
  • deletePhoneInfo() 마지막으로 배열 안에 객체의 수를 맞춰주기 위해 count-1

 

PhoneInfoMain.java

import java.util.Scanner;
public class PhoneInfoMain {
  public static void main(String[] args) {

      Scanner sc = new Scanner(System.in);
      Manager m = new Manager();

      while (true) {
          System.out.println("1.추가  2.출력  3.검색  4.수정  5.삭제  6.종료");
          System.out.println("선택 : ");
          String menu = sc.nextLine();

          switch (menu) {
          case "1":
              m.addPhoneInfor();
              break;
          case "2":
              m.listPhoneInfo();
              break;
          case "3":
              m.searchPhoneInfo();
              break;
          case "4":
              m.updatePhoneInfo();
              break;
          case "5":
              m.deletePhoneInfo();
          case "6":
                System.out.println("프로그램 종료");
              return;              
          }
       }
     }
}

'Java' 카테고리의 다른 글

[Java] 객체지향(4) 다형성 정리  (0) 2020.07.15
[Java] 객체지향(3) 상속 정리  (0) 2020.07.15
[Java] 객체지향(1) 정리  (0) 2020.07.11
[Java] 배열의 정렬(sort) 정리  (0) 2020.07.11
[Java] 배열(Array) 정리  (0) 2020.07.10