자바 클래스 간 공유 및 extends (상속)을 사용하는 원리
class Main {
public static void main(String[] args) {
사람 a사람 = new 사람(); // main 클래스에서는 a사람이라는 변수가 하나만 있음
a사람.나이 = 20; // 나이는 사람이라는 클래스 안에 있는 거지 main에 속한 변수는 아님
a사람.a왼팔 = new 팔(); // a왼팔도 나이와 동일함
}
}
class 사람 {
팔 a왼팔; // 여기에서 a왼팔 이라는 변수를 따로 선언함 다만, 팔 class가 있어야 선언 가능
int 나이; // 여기에서 따로 나이라는 변수를 따로 선언함
}
class 팔 { //extends를 쓰지 않은 건 팔은 사람이 아니고 사람 신체 일부이기 때문
}
// extends를 쓰려는 클래스에 작성해야함 (쉽게 생각하려면 팔은 사람이 아니라 신체 일부라서 extends를 쓰는게 아니다)
위와 같이 extends를 무조건적으로 사용하는게 아닌 사용해야 할 때만 사용하자
(위 처럼 쉽게 생각하는게 좋다, 사람의 일부 중 팔이 있는거지 팔이 사람인건 아니다.)
class 사람에 팔 a왼팔을 만들려면 class 팔이 있어야하는데 class 팔이 없으면 에러 발생한다.

위와 같이 팔 이라는 class 가 없다고 뜬다. 그렇기 때문에 class 팔을 만들어주면 위의 오류를 해결할 수 있다.
위의 코드는 사람이 a왼팔 이라는 변수를 가질 수 있게 만들어주는 코드이다.
class Main {
public static void main(String[] args) {
전사 a전사 = new 전사();
a전사.나이 = 20;
a전사.a무기 = new 활();
a전사.a무기 = new 칼();
}
}
class 전사{
int 나이;
무기 a무기;
}
class 무기 {
}
class 활 extends 무기{
}
class 칼 extends 무기{ //extends 에 해당하는 클래스가 선언하려는 클래스에 속하는지가 아닌 맞는지 즉 칼은 무기냐 했을 때 맞는거고 팔은 사람이냐 했을 때에는 아닌 것이니 extends를 안씀
}
위의 코드에서는 extends를 사용했다.
활과 칼이라는 객체가 생성이 되어있는데 활과 칼은 무기이기 때문에 extends를 사용했다.
class 전사에 무기 a무기; 를 작성해놨는데 실질적으로 생각을 해보면
무기 a무기 = new 활(); 과 같은 거라고 생각하면 된다.
근데 무기 a무기 에는 new 활(); 과 new 칼(); 이 들어가야하기 때문에 무기 a무기; 로 끝낸거고
전사의 클래스 무기가 선언이 되어있으니 a전사.a무기 = new 활(); 과 new 칼();에 들어가는데
여기에서 class 활과 class 칼이 없고 extends를 쓰지 않았다면 에러가 발생한다.

위와 같은 에러가 발생을 하는데 에러를 보면 incompatible types : 활 cannot be converted to 무기 라고 되어있다.
쉽겍 생각하면 무기라는 것에는 아무것도 없는 상태이다보니까 활과 칼이 없다고 뜨는거라고 생각하면 된다.
class 활과 class 칼에도 아무것도 없고 상속된게 없는 상태라서 무기 클래스에 상속을 해줘야한다.
package com.example.MyJavaProject;
class Main {
public static void main(String[] args) {
전사 a전사 = new 전사();
String 이름 = "칸";
a전사.이름 = 이름;
a전사.나이 = 20;
a전사.자기소개();
// 안녕하세요. 저는 20살 칸입니다.
a전사.나이++;
a전사.자기소개();
// 안녕하세요. 저는 21살 칸입니다.
a전사.나이 = 30;
a전사.이름 = "철수";
a전사.자기소개();
// 안녕하세요. 저는 30살 철수입니다.
a전사.a무기 = new 활();
a전사.공격();
// 출력 : 철수가 활로 공격합니다.
a전사.a무기 = new 칼();
a전사.공격();
// 출력 : 철수가 칼로 공격합니다.
}
}
class 전사 {
String 이름;
int 나이;
void 자기소개 () {
System.out.println("안녕하세요. 저는" + 나이+ "살" + 이름 + "입니다.");
}
무기 a무기;
void 공격 () {
a무기.공격(이름); // this 생략 가능,
}
}
class 무기 {
public void 공격 (String 이름) {
}
}
class 활 extends 무기 {
public void 공격 (String 이름) {
System.out.println(이름 + "가 칼로 공격합니다.");
}
}
class 칼 extends 무기{
public void 공격 (String 이름) {
System.out.println(이름 + "가 활로 공격합니다.");
}
위에서 한 것을 토대로 해서 만들면서 public void 라는 것을 추가를 했으며 그리고 매서드에 String 이름이 추가 됐다.
무기,활,칼 이라는 클래스를 만들고 활과 칼은 무기여야하니 extends 무기를 작성을 하고 똑같이 무기 a무기를
전사 클래스 안에 작성을 해서 바로 위의 문제와 코드가 똑같이 만들어진 상태이다.
(문제를 풀 때 하나씩 하나씩 해보면 좋을 것 같다.)
여기에서 제일 큰 문제는 a전사.공격의 출력이 철수가 활or칼로 공격합니다. 가 출력이 되어야했다.
즉, 활로 공격도 하고 칼로도 공격을 한 번 해야하는 상황이다.
그렇기 때문에 public void를 사용을 한거고 여기에서 public은 지역변수처럼 해당 지역에서만 쓸 수 있는게 아닌
다른 곳에서도 사용할 수 있는 것을 만들어주는거다.
'Java' 카테고리의 다른 글
| Java(자바) - 상속,접근제한자, 추상클래스 및 오버라이딩 (0) | 2022.08.25 |
|---|---|
| 2022-08-24 자바 수업 문제 풀이 (0) | 2022.08.24 |
| Java(자바) 생성자 오버로딩 및 this와 패키지 (0) | 2022.08.17 |
| Java(자바) 클래스 다듬는 생성자와 this , 메소드 오버로딩 (0) | 2022.08.17 |
| Java(자바) String클래스의 메소드와 변수의 scope 및 static (0) | 2022.08.16 |
댓글