1. Java 기초 다지기 (6)
1) 멤버필드,메서드의 상속
Person 클래스
public class Person {
String name;
int age;
public Person(String name, int age) { // Source-Generate Constructor using field
// 생성자 자동으로 만듬
this.name = name;
this.age = age;
}
public String getName() { // getter,setter 자동으로 만듬
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
Student 클래스
public class Student extends Person {
String major;
public Student(String name,int age,String major) {
super(name,age); // 상위클래스 생성자 호출
// this.name = name; // 멤버를 다시 초기화 할 수 있지만 단일책임 원칙에 위배됌
// this.age = age; //
// super.name = name; // 정확히는 부모의 필드
// super.age = age; // super도 객체임.
// *this vs super : 만약 하위클래스에도 int age; 가 있다면 this.age 와 super.age는 다름
this.major = major;
}
public String getMajor() { // Student에만 있는 메소드 Person이 호출못함
return major;
}
}
Teacher 클래스
public class Teacher extends Person{
String subject;
public Teacher(String name,int age, String subject) {
super(name,age);
this.subject = subject;
}
public String getSubject() { //Teacher에만 있는 메소드 Person이 호출못함
return subject;
}
}
Day6.java
class Person{
//final String NAME = "홍길동"; // final 은 보통 대문자로 함.
// final String NAME;
// public Person(String name) {
//
// NAME = name; // final은 생성자에서도 초기화 가능
//
// }
private static final String NAME; // static final 초기화 가능
// final은 상수이지만 public or private 고민해봐야함
static {
NAME = "유라";
}
}
class Lance{
String sword;
public void setLance(String sword) {
this.sword = sword;
}
}
class Lancer{ //Lancer는 Lance를 포위하는 전체객체이다. (whole Object)
Lance weapon; //Lance는 Lancer에 포함되는 부품객체이다. (Part Object)
//weapon은 초기화하지 않았으므로 자동초기화가 되어 null값으로 초기화
public Lancer() { //생성자에서 부품객체의 인스턴스를 만듬 => 복합화 Composition
weapon = new Lance();
System.out.println("생성자를 활용하여 무기 생성");
}
public void setWeapon(Lance weapon) {
this.weapon = weapon; // Setter로
}
public void fight() {
System.out.println(weapon.sword + "으로 싸웁니다.");
}
}
// 상속의 개념
class People{
String name;
int age;
public People() {
System.out.println("People 클래스 생성자 호출");
name = "홍길동";
age = 21;
System.out.println("People 클래스 생성자 종료");
}
}
class Student extends People{ // A extends B => 상속했다. is a 관계
String major; // Student 는 People 이다 (o). Student 는 name,age,major를 가짐
public Student() {
//super(); 하위클래스로 객체 생성 시, 상위클래스 default 생성자 호출하고 하위클래스 생성자 호출함
// *상위 클래스 default 생성자( public 클래스먕(인수X) ) 없을 시 하위클래스 객체 못만듬
// *아니면 super(인수)형태로 호출해주어야함
System.out.println("People 클래스 생성자 호출");
major = "전산학과";
System.out.println("Student 클래스 생성자 호출");
}
}
public class Day6 {
public static void main(String[]arg) {
// API 활용하기
char [] cArray = {'A','B','C'};
String s1 = String.valueOf(cArray); // valueof는 static 멤버(클래스멤버이다.)
// 클래스멤버이기 때문에 클래스.메서드 가능
boolean endwiths = "자바 프로그래밍".endsWith("프로그래밍"); // Non-static 이기때문에
System.out.println(endwiths); // "자바프로그래밍" 이라는 인스턴스.메서드 한 것임
System.out.println(s1);
String s2 = "Hello Java Programing";
String convert = s2.toUpperCase();
System.out.println(convert);
final int A =10; // 변수를 상수화 시킨다. (사용자 정의 상수)
//A = 20; A를 바꿀수없음
//복합객체
System.out.println();
Lancer lancer1 = new Lancer();
lancer1.fight();
System.out.println();
Lancer lancer2 = new Lancer();
lancer2.weapon.setLance("steel sword");
lancer2.fight();
//상속 // 하위클래스로 객체 생성했을 때
// 1.상위 클래스의 default 생성자 호출/ 종료 2. 하위 클래스 생성자 호출/종료
// *상위 클래스 default 생성자( public 클래스만(인수X) ) 없을 시 하위클래스 객체 못만듬
// *아니면 super(인수)형태로 호출해주어야함
Student std1 = new Student(); // 부모클래스 = 상위클래스 = Base = Super
// 자식클래스 = 하위클래스 = Sub클래스
System.out.println(std1.name); // 부모클래스가 가진 멤버필드도 가짐
System.out.println(std1.age); // 부모클래스가 가진 멤버필드도 가짐
System.out.println(std1.major); //
People std2 = new Student();
System.out.println(std2.name); // 승인
System.out.println(std2.age); // 승인3
// System.out.println(std2.major); // 일단 People 영역까지 봄
// 참초승인 단계과정이 필요. 참조승인-컴파일타임. 참조-런타임
// * 자바는 다중상속을 허용하지 않음
}
}
감사합니당🐷🐷🐷