Java_기초_Day6

임정민·2022년 10월 26일
1

언어공부

목록 보기
7/10
post-thumbnail

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 영역까지 봄
		// 참초승인 단계과정이 필요. 참조승인-컴파일타임. 참조-런타임
		// * 자바는 다중상속을 허용하지 않음
	}
}

감사합니당🐷🐷🐷

profile
https://github.com/min731

0개의 댓글