사이먼's 코딩노트
[Java] 생성자 문제풀이 본문
[생성자 문제]
- 다음은 생성자와 관련된 문제를 풀어보고 비교해봅시다.
- 문제의 목적은 다음과 같습니다.
- 각각의 사람이 배달음식을 주문할 때, 각자의 상황과 기호에 따라 적절한 음식점과 음식이 배달되도록 코드를 작성하는 것이다.
- 우리는 해당 문제를 두 가지 버전으로 나눠서 풀어보려 합니다.
- 첫번째 코드는 main 메서드에서 일일이 속성 값들을 저장하여 원하는 출력문을 출력하는 코드이고, 두번째 코드는 생성자를 통해 값을 최초에 세팅하고 원하는 출력문을 출력하는 코드이다.
- 두 코드를 잘 비교하면서 더 편리한 방법이 어떤 것인지 느껴봅시다.
[첫번째 코드]
public class Main {
public static void main(String[] args) {
사람 a김철수 = new 사람();
a김철수.이름 = "김철수";
a김철수.전화번호 = "010-1234-1234";
a김철수.a좋아하는_음식점 = new 영화반점();
a김철수.선호하는_음식의_매운정도 = "매운";
a김철수.선호하는_음식 = "짬뽕";
사람 a김영희 = new 사람();
a김영희.이름 = "김영희";
a김영희.전화번호 = "010-4321-4321";
a김영희.a좋아하는_음식점 = new 북경반점();
a김영희.선호하는_음식의_매운정도 = "안매운";
a김영희.선호하는_음식 = "짬뽕";
a김철수.배달_음식_주문하다();
// 영화반점에서 김철수(010-1234-1234)에게 매운 짬뽕(을)를 배달합니다.
a김영희.배달_음식_주문하다();
// 북경반점에서 김영희(010-4321-4321)에게 안매운 짬뽕(을)를 배달합니다.
a김영희.a좋아하는_음식점 = a김철수.a좋아하는_음식점;
a김영희.선호하는_음식의_매운정도 = "아주 매운";
a김영희.선호하는_음식 = "짜장";
a김영희.배달_음식_주문하다();
// 영화반점에서 김영희(010-4321-4321)에게 아주 매운 짜장(을)를 배달합니다.
}
}
class 사람 {
String 이름;
String 전화번호;
음식점 a좋아하는_음식점;
String 선호하는_음식의_매운정도;
String 선호하는_음식;
void 배달_음식_주문하다() {
a좋아하는_음식점.주문(이름, 전화번호, 선호하는_음식의_매운정도, 선호하는_음식);
}
}
class 음식점 {
void 주문(String 이름, String 전화번호, String 맵기, String 음식) {
}
}
class 영화반점 extends 음식점 {
void 주문(String 이름, String 전화번호, String 맵기, String 음식) {
System.out.printf("영화반점에서 %s(%s)에게 %s %s(을)를 배달합니다.\n", 이름, 전화번호, 맵기, 음식);
}
}
class 북경반점 extends 음식점 {
void 주문(String 이름, String 전화번호, String 맵기, String 음식) {
System.out.printf("북경반점에서 %s(%s)에게 %s %s(을)를 배달합니다.\n", 이름, 전화번호, 맵기, 음식);
}
}
- 첫번째 코드는 main 메서드에서 a김철수와 a김영희에 사람 클래스와 연결된 리모콘을 하나씩 생성하여 객체를 총 2개 생성하였다.
- 각 객체 변수별로 이름, 전화번호, 좋아하는 음식점, 음식의 매운정도, 선호하는 음식을 사용자가 직접 저장하였다.
- 여기서 이름, 전화번호, 음식의 매운정도, 선호하는 음식은 모두 String 타입이기 때문에 사람 클래스에서 String으로 인스턴스 변수를 선언하였다.
- 하지만 a좋아하는_음식점 변수는 해당 인스턴스 변수 하나로 영화반점과 국화반점을 모두 연결하는 리모콘을 생성해야되기 때문에 어느 한쪽으로 타입을 정하는 데에 한계가 있다. [a김철수.a좋아하는_음식점 = new 영화반점()]
- 그래서 모든 음식점을 포용할 수 있는 음식점 클래스를 생성하고 영화반점과 국화반점은 모두 extends를 통해 음식점에게 상속받도록 하였다.
- 마지막으로 main 메서드에 작성된 배달_음식_주문하다() 메서드는 실제로 사람 클래스에 적용된 메서드이지만 각 사람별로 좋아하는 음식점에 주문을 할 수 있도록 a좋아하는_음식점.주문() 이라는 메서드를 호출한다.
- a좋아하는_음식점.주문() 메서드가 호출되려면 a좋아하는_음식점의 실제 타입인 음식점에도 주문() 이라는 메서드가 존재해야되고 상속받는 영화반점과 북경반점에도 주문() 메서드를 작성하여 각 음식점에 맞게 오버라이딩을 해준다.
- 이 때 메서드의 인자와 매개변수로 사용자가 작성한 이름, 전화번호, 음식의 매운정도, 선호하는 음식의 값을 서로 주고받도록 정의했다.
[두번째 코드]
public class Main {
public static void main(String[] args) {
사람 a김철수 = new 김철수();
사람 a김영희 = new 김영희();
a김철수.배달_음식_주문하다();
// 영화반점에서 김철수(010-1234-1234)에게 매운 짬뽕(을)를 배달합니다.
a김영희.배달_음식_주문하다();
// 북경반점에서 김영희(010-4321-4321)에게 안매운 짬뽕(을)를 배달합니다.
a김영희.a좋아하는_음식점 = a김철수.a좋아하는_음식점;
a김영희.선호하는_음식의_매운정도 = "아주 매운";
a김영희.선호하는_음식 = "짜장";
a김영희.배달_음식_주문하다();
// 영화반점에서 김영희(010-4321-4321)에게 아주 매운 짜장(을)를 배달합니다.
}
}
class 사람 {
String 이름;
String 전화번호;
음식점 a좋아하는_음식점;
String 선호하는_음식의_매운정도;
String 선호하는_음식;
void 배달_음식_주문하다() {
a좋아하는_음식점.주문(이름, 전화번호, 선호하는_음식의_매운정도, 선호하는_음식);
}
}
class 김철수 extends 사람 {
김철수() {
이름 = "김철수";
전화번호 = "010-1234-1234";
a좋아하는_음식점 = new 영화반점();
선호하는_음식의_매운정도 = "매운";
선호하는_음식 = "짬뽕";
}
}
class 김영희 extends 사람 {
김영희() {
이름 = "김철수";
전화번호 = "010-1234-1234";
a좋아하는_음식점 = new 북경반점();
선호하는_음식의_매운정도 = "안매운";
선호하는_음식 = "짬뽕";
}
}
class 음식점 {
void 주문(String 이름, String 전화번호, String 맵기, String 음식) {
}
}
class 영화반점 extends 음식점 {
void 주문(String 이름, String 전화번호, String 맵기, String 음식) {
System.out.printf("영화반점에서 %s(%s)에게 %s %s(을)를 배달합니다.\n", 이름, 전화번호, 맵기, 음식);
}
}
class 북경반점 extends 음식점 {
void 주문(String 이름, String 전화번호, String 맵기, String 음식) {
System.out.printf("북경반점에서 %s(%s)에게 %s %s(을)를 배달합니다.\n", 이름, 전화번호, 맵기, 음식);
}
}
- 두번째 코드는 각 클래스 생성과 메서드 생성 모두 첫번째 코드와 동일하다.
- 다만 다른 점은 main 메서드에서 사용자가 직접 속성값을 저장하지 않고 new 김철수(), new 김영희()를 통해 새로운 객체를 만들어 a김철수와 a김영희에 연결되어 있다는 점이 다르다.
- 지금과 같은 상황에선 김철수, 김영희 클래스를 사람 클래스에 상속받도록 추가하여 생성자를 통해 기본 정보를 세팅하면 된다.
- 생성자의 이름은 반드시 클래스와 같아야하며, 현재 김철수와 김영희 클래스는 사람 클래스의 자식 클래스이기 때문에 부모 클래스의 인스턴스 변수를 모두 상속받는다.
- 그렇기 때문에 각 클래스에서 따로 인스턴스 변수를 선언하지 않고 바로 초기 값을 세팅하면 된다.
반응형
'Java > Java' 카테고리의 다른 글
[Java] 종합 문제풀이 (0) | 2024.02.19 |
---|---|
[Java] 추상 클래스 / 인터페이스 (0) | 2024.02.14 |
[Java] 캐스팅 / 생성자 (2) | 2024.02.14 |
[Java] 클래스와 메서드를 활용한 문제풀이 (0) | 2024.02.06 |
[Java] 상속 / 오버로딩 / 오버라이딩 (0) | 2024.02.02 |