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 Main {
public static void main(String[] args) {
사람 a김철수 = new 김철수();
a김철수.이름 = "김철수";
a김철수.번호 = "010-1234-1234";
a김철수.선호하는_음식 = "짬뽕";
a김철수.선호하는_음식의_매운정도 = "매운";
a김철수.a좋아하는_음식점 = new 영화반점();
사람 a김영희 = new 김영희();
a김영희.이름 = "김영희";
a김영희.번호 = "010-4321-4321";
a김영희.선호하는_음식 = "짬뽕";
a김영희.선호하는_음식의_매운정도 = "안 매운";
a김영희.a좋아하는_음식점 = new 북경반점();
a김철수.배달_음식_주문하다();
// 영화반점에서 김철수(010-1234-1234)에게 매운 짬뽕(을)를 배달합니다.
a김영희.배달_음식_주문하다();
// 북경반점에서 김영희(010-4321-4321)에게 안매운 짬뽕(을)를 배달합니다.
a김영희.a좋아하는_음식점 = a김철수.a좋아하는_음식점;
a김영희.선호하는_음식의_매운정도 = "아주 매운";
a김영희.선호하는_음식 = "짜장";
a김영희.배달_음식_주문하다();
// 영화반점에서 김영희(010-4321-4321)에게 아주 매운 짜장(을)를 배달합니다.
}
}
class 사람 {
String 이름;
String 번호;
String 선호하는_음식의_매운정도;
String 선호하는_음식;
음식점 a좋아하는_음식점; // 이걸 활성화하려면 음식점이라는 class를 생성해야한다.
void 배달_음식_주문하다() {
a좋아하는_음식점.주문(이름,번호,선호하는_음식, 선호하는_음식의_매운정도);
}
}
class 김철수 extends 사람{
// 위의 코드에서 보면 김철수는 사람에 들어가기 때문에 extends를 활용해 사람에 속하게 한다.
// 그 코드는 사람 a김철수 = new 김철수(); << 이 코드이다.
}
class 김영희 extends 사람{
// 위의 코드에서 보면 김영희는 사람에 들어가기 때문에 extends를 활용해 사람에 속하게 한다.
// 그 코드는 사람 a김영희 = new 김영희(); << 이 코드이다.
}
class 음식점 {
void 주문 (String 주문자명, String 주문자_전화번호, String 음식, String 매운정도){
}
}
class 영화반점 extends 음식점 {
//a김철수.a좋아하는_음식점 = new 영화반점(); << 이 코드로 인해 영화반점이라는 클래스를 생성 후 음식점에 상속해야한다.
void 주문 (String 주문자명, String 주문자_전화번호, String 음식, String 매운정도){
System.out.printf("영화반점에서 %s(%s)에게 %s %s (을)를 배달합니다.\n", 주문자명, 주문자_전화번호, 매운정도, 음식 );
}
}
class 북경반점 extends 음식점 {
//a김영희.a좋아하는_음식점 = new 북경반점(); << 이 코드로 인해 북경반점이라는 클래스를 생성 후 음식점에 상속해야한다.
void 주문 (String 주문자명, String 주문자_전화번호, String 음식, String 매운정도){
System.out.printf("북경반점에서 %s(%s)에게 %s %s (을)를 배달합니다.\n", 주문자명, 주문자_전화번호, 매운정도, 음식 );
}
}
위 처럼 문제를 풀어도 되지만 아래의 코드 처럼 문제를 풀 수 있다.
아래처럼 푸는 이유는 최대한 반복하는 일이 없도록 줄인거라고 생각하면 된다.
package com.example.MyJavaProject;
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 전화번호;
String 선호하는_음식;
String 선호하는_음식의_매운정도;
음식점 a좋아하는_음식점;
void 배달_음식_주문하다() {
a좋아하는_음식점.주문(이름, 전화번호, 선호하는_음식의_매운정도, 선호하는_음식);
}
}
class 김철수 extends 사람{
김철수 () { // 이 부분으로 초기값을 준거라고 생각하면 된다
이름 = "김철수";
전화번호 = "010-1234-1234";
선호하는_음식 = "짬뽕";
선호하는_음식의_매운정도 = "매운";
a좋아하는_음식점 = new 영화반점();
}
}
class 김영희 extends 사람{
김영희 () { // 이 부분으로 초기값을 준거라고 생각하면 된다
이름 = "김영희";
전화번호 = "010-4321-4321";
선호하는_음식 = "짬뽕";
선호하는_음식의_매운정도 = "안 매운";
a좋아하는_음식점 = new 북경반점();
}// 이 부분이 실질적으로 사람 a김영희 = new 김영희(); 여기에 a김영희.이름 = "김영희" 이 뜻과 같은 뜻이다.
}
class 음식점 {
String 이름;
void 주문 (String 주문자명, String 주문자_번호, String 음식, String 매운정도) {
System.out.printf("%s에서 %s(%s)에게 %s %s (을)를 배달합니다.\n", 이름,주문자명,주문자_번호,음식,매운정도);
}
}
class 영화반점 extends 음식점 {
영화반점 () { // 이 부분도 음식점에서 한 번에 속하게 하여 이름만 주어진거고 출력값에 이름은 주문자 이름이 아닌
// 영화반점과 북경반점은 음식점에 속했고 음식점에 String 이름; 이 있기 때문에 이름은 음식점 이름이다
이름 = "영화반점";
}
}
class 북경반점 extends 음식점 {
북경반점 () {
이름 = "북경반점";
}
}
위의 코드를 통해서 System.out.printf 에서 변경해야할걸 한 번에 변경을 할 수 있다.
그렇기 때문에 조금 더 편리하다고 볼 수 있다.
(예를 들면 끝에 .을 !로 바꾼다면 System.out.printf 라인에 배달합니다. 에서 배달합니다!로 바꾸면 끝이다.)
(저게 아니라 밑에 쭉 쓴다면 하나하나 다 바꿔줘야하는 것을 한 번에 바꿀 수 있다.)
package com.example.MyJavaProject;
class Main {
public static void main(String[] args) {
전사 a전사 = new 전사();
a전사.공격();
// 출력 => 아직 무기가 없습니다.
a전사.a무기 = new 칼();
a전사.공격();
// 출력 => 칼로 공격합니다.
}
}
이 문제를 푼 결과를 바로 밑에 올리려고 한다.
package com.example.MyJavaProject;
class Main {
public static void main(String[] args) {
전사 a전사 = new 전사();
a전사.공격();
// 출력 => 아직 무기가 없습니다.
a전사.a무기 = new 칼();
a전사.공격();
// 출력 => 칼로 공격합니다.
}
}
class 전사 {
무기 a무기;
void 공격 () {
if (a무기 == null) {
System.out.println("아직 무기가 없습니다.");
}
else {
a무기.공격하기();
}
}
}
class 무기 {
void 공격하기 () {
System.out.println("칼로 공격합니다.");
}
}
class 칼 extends 무기 {
}
이건 a전사 a무기의 값이 뭔지를 잘 생각해보면 된다.
초기에는 a전사에도 a무기에도 null 값이 들어가있는 상태이다 왜냐하면 아무것도 지정된게 없다.그냥 a전사는 new 칼 이라는 객체만 가르키고 있고 a무기 또한 칼 클래스만 가르키고 있지값이 주어지거나 한게 없기 때문에 null 값이 들어가있는 상태이다.
그렇기 때문에 if문을 통해서 a무기가 null 값일 때 System.out.println 으로 " 아직 무기가 없습니다. "를 출력하고else 그게 아니면 a무기.공격하기(); 라는 것을 통해 무기 클래스에 공격하기 변수에 써있는 System.out.println인"칼로 공격합니다."를 출력하게 된다.
그 이유는 초기에 a전사.공격(); 에는 a무기가 없기 때문에 아직 무기가 없습니다. 가 출력이 되는거고그 출력이 된 후 a전사.a무기 = new 칼(); 이 생기기 때문에 칼로 공격합니다가 출력 된다.
package com.example.MyJavaProject;
class Main {
public static void main(String[] args) {
전사 a전사 = new 전사();
a전사.a무기1 = new 칼();
a전사.공격();
// 출력 => 전사가 칼로 공격합니다.
a전사.a무기1 = new 활();
a전사.공격();
// 출력 => 전사가 활로 공격합니다.
a전사.a무기2 = new 칼();
a전사.공격();
// 출력 => 전사가 활로 공격합니다.
// 출력 => 전사가 칼로 공격합니다.
}
}
이 문제를 푼 결과를 바로 밑에 올리려고 한다.
package com.example.MyJavaProject;
class Main {
public static void main(String[] args) {
전사 a전사 = new 전사();
a전사.a무기1 = new 칼();
a전사.공격();
// 출력 => 전사가 칼로 공격합니다.
a전사.a무기1 = new 활();
a전사.공격();
// 출력 => 전사가 활로 공격합니다.
a전사.a무기2 = new 칼();
a전사.공격();
// 출력 => 전사가 활로 공격합니다.
// 출력 => 전사가 칼로 공격합니다.
}
}
class 전사 {
무기 a무기1;
무기 a무기2;
void 공격 () {
if (a무기1 !=null) {
a무기1.공격하기();
}
if (a무기2 != null) {
a무기2.공격하기();
}
}
}
class 무기 {
String 무기이름;
void 공격하기 () {
System.out.printf("전사가 %s로 공격합니다.\n",무기이름);
}
}
class 칼 extends 무기 {
칼 () {
무기이름 = "칼";
}
}
class 활 extends 무기 {
활 () {
무기이름 = "활";
}
}
위의 코드는 if문을 활용하여 만든 코드이다.
말 그대로 a무기1 에는 null 값이 들어있을 이유가 없기 때문에
a전사가 전사 클래스를 가르키고 있는 상황에서 a무기에 바로 칼 클래스를 주었기 때문에
null 값이 있지 않아서 바로 출력이 된다 그렇기 때문에 if 문에 null이 아닐경우라는 경우 값을 준거라고 생각하면 된다.
package com.example.MyJavaProject;
class Main {
public static void main(String[] args) {
전사 a전사1 = new 전사();
a전사1.a왼손무기 = new 칼();
a전사1.공격();
// 출력 => 전사가 왼손으로 칼(을)를 사용합니다.
전사 a전사2 = new 전사();
a전사2.a왼손무기 =new 창 ();
a전사2.a오른손무기 = new 도끼 ();
a전사2.공격();
// // 출력 => 전사가 왼손으로 창(을)를 사용합니다.
// // 출력 => 전사가 오른손으로 도끼(을)를 사용합니다.
}
}
이 문제를 푼 결과를 바로 밑에 올리려고 한다.
package com.example.MyJavaProject;
class Main {
public static void main(String[] args) {
전사 a전사1 = new 전사();
a전사1.a왼손무기 = new 칼();
a전사1.공격();
// 출력 => 전사가 왼손으로 칼(을)를 사용합니다.
전사 a전사2 = new 전사();
a전사2.a왼손무기 =new 창 ();
a전사2.a오른손무기 = new 도끼 ();
a전사2.공격();
// // 출력 => 전사가 왼손으로 창(을)를 사용합니다.
// // 출력 => 전사가 오른손으로 도끼(을)를 사용합니다.
}
}
class 전사 {
무기 a왼손무기;
무기 a오른손무기;
void 공격 () {
if (a왼손무기 != null) {
a왼손무기.공격하기();
}
if (a오른손무기 != null) {
a오른손무기.공격하기();
}
}
}
class 무기 {
String 이름;
void 공격하기 () {
System.out.printf("전사가 %s (을)를 사용합니다.\n", 이름);
}
}
class 칼 extends 무기 {
칼 () {
이름 = "칼";
}
}
class 창 extends 무기 {
창 () {
이름 = "창";
}
}
class 도끼 extends 무기 {
도끼 () {
이름 = "도끼";
}
}
위의 코드도 동일한 상황이라고 생각하면 되는데 왼손무기와 오른손무기에 동일하게 null일 경우가 없기 때문이고
왼손무기에는 칼을 오른손 무기에는 창과 도끼를 바로 줘버렸기 때문에 null 일 경우가 없어서
출력이 바로 되는 상황이라고 볼 수 있다.
if문을 여기에서도 바로 활용을 할 수 있다.
'Java' 카테고리의 다른 글
| 2022-08-25 자바 수업 문제 풀이 (Arrlist 및 생성자) (0) | 2022.08.26 |
|---|---|
| Java(자바) - 상속,접근제한자, 추상클래스 및 오버라이딩 (0) | 2022.08.25 |
| Java(자바) - 클래스 간 공유 (extends 의 활용 정리) (0) | 2022.08.23 |
| Java(자바) 생성자 오버로딩 및 this와 패키지 (0) | 2022.08.17 |
| Java(자바) 클래스 다듬는 생성자와 this , 메소드 오버로딩 (0) | 2022.08.17 |
댓글