객체지향_상속

소정·2023년 1월 27일
0

Java

목록 보기
13/23

상속(extends)이란?


각 클래스가 포함하고 있는 필드와 메서드가 중복되는것을 막아 유지보수성을 높인다
상속은 부모클래스의 기능, 변수들은 편하게 사용 할 수 있는 문법
상속은 부모의 멤버만 가져오는 것이 아니라 부모객체도 같이 생성하는 개념이다
즉, 객체 안에 객체가 있는 모습임

상속 구현 방법

접근 제한자 class 클래스명 extends 부모클래스명 {
}


상속을 부르는 용어

상위하위
C#parentschild
Javasupersub
C++basedriven

public class Main {

	public static void main(String[] args) {
		
		First ff = new First();
		ff.showFirst();
		System.out.println();
		
		Second s = new Second();
		s.show();
		
	}
}

public class First {
	
	//접근제한 적용
	private int a;
	
	//멤버값 출력하는 기능 
	public void showFirst() {
		System.out.println("a : "+ a);
	}
	
	//생성자
	public First(){
		System.out.println("first객체 생성!");
	}

	public First(int a){

	}
	
}


public class Second extends First{
	
	private int b;
	
	public void show() {
		//System.out.println(a); //error :부모 private멤버 사용 불가
		showFirst();
		System.out.println("b: "+b);
		System.out.println();
	}
	
	//constructor
	public Second() {
		System.out.println("second 객체 생성");
	}
	
}

-> 부모부터 생성되고 자식이 호출됨을 볼수 있다

super()

  • 부모의 생성자 전달, 반드시 젤 첫문장에 써야됨
  • 생성자에서만 사용 가능 내가 아닌 부모의 생성자를 호출

public class Main {

	public static void main(String[] args) {

		Person ps = new Person("kim", 22);
		ps.show();
		System.out.println();
		
		//학생
		Student st = new Student("park",21,"경영");
		st.show();
		System.out.println();

		
	}

}


public class Person {
	
	private String name;
	private int age;
	
	//생성자
	public Person() {
		name = "no name";
		age = 0;
	}
	
	//생성자 오버로딩
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public void show() {
		System.out.println("이름 : "+ name);
		System.out.println("나이 : "+ age);
	}
}



public class Student extends Person {
	private String major;
	
	
	public Student() {
		super();
		major = "no major";
	}
	
	public Student(String name,int age,String major) {
		super(name,age);
		this.major = major;
	}
	
	public void show() {
		super.show();
		System.out.println("전공 : "+major);
	}
	
}

this()도 super()도 첫문장에 써야하는데 누가 첫줄에 나와야할까?
쓰잘데기 없는 고민 둘을 같이 쓰는 경우는 없음
this 호출한 곳에서 super를 호출함


아하! 모먼트
여러클래스를 동시에 상속받는 다중상속은 자바에선 안됨
-> 내가 상속받은 부모가 혹시나 똑같을 까봐 막아둠 c++엔 if define이란 것이 있어서 다중 상속 가능함 하지만 자바에선 오류 위험이 있는 것을 제한함



오버라이드(override)

부모클래스의 기능이 원하는 기능과 다른 상황에서 상속받은 기능(메소드)를 원하는 동작으로 수정하고 싶을때 사용하는 문법

부모 클래스 중 기능을 바꾸고 싶은 메소드를 상속받은 자식 클래스에서 이름을 똑같이 만들어서 쓴다

이름이 같은데 문제가 없나?
오버라이드는 덮어쓰는 것이 아님 올라타는 느낌! 같은 이름의 부모 메소드를 지우는 것이 아니고 덮어버림 .(접근 연산자) 으로 접근했을때 부모의 것은 안보이고 같은 이름으로 재정의한 내것만 보인다


public class Main {

	public static void main(String[] args) {

		Robot r = new Robot();
		r.move();
		r.attack();
		System.out.println();
		
		FlyRobot f = new FlyRobot();
		f.move();
		f.attack();
		f.fly();
		System.out.println();
		
	}

}


public class Robot {

	int HP;
	
	void move() {
		System.out.println("아장아장");
	}
	
	void attack() {
		System.out.println("주먹 발사");
	}
	
	
	
}


public class FlyRobot extends Robot{

	//상속받아서 HP 이동 공격 보유
	
	//새러운 기능 추가
	
	void fly() {
		System.out.println("오~~ 난다");
	}
	
	//상속받은 공격 메소드의 기능 변경
	//오버라이드 override
	void attack() {
		System.out.println("미사일 발사");
	}
	
}

기존 기능을 유지하면서 기능을 조금만 바꾸기

super를 이용하여 부모의 것을 받고 내것을 추가한다


public class Main {

	public static void main(String[] args) {

		Second s = new Second();
		s.show();

	}

}


public class First {
	
	private int a;
	
	public void show() {
		System.out.println("a : "+a);
	}
	
}


public class Second extends First {

	private int b;

	// override
	public void show() {
		//first에서 출력 요청
		//show(); // 얘는 재귀함수
		super.show();
		System.out.println("b : "+b);
	}

}



final 상수

값을 더이상 변경할 수 없는 것을 만드는 키워드

//1. 지역 변수

public class Main {

	public static void main(String[] args) {

		//지역변수에 final을 붙이면 상수화된 변수
	 	final int A = 10;
//		A=20; //변경 불가
		
		//자바의 특이한 점
	 	final int b;
	 	b=50;  //처음 값을 대입할 때 상수화
		
	}

}


//2. 멤버변수

public class Test {

	final int NUM = 0; //멤버변수
	//멤버변수는 0으로 자동 초기화 하는데 기본값으로 초기화 하는것을 의심해서 오류남
	//바로 초기화 해야됨
	
}

//3. 매개변수

public class Test {
	
	//매개변수
 	void bbb(final int N) {
 		System.out.println(N);
 	}
	
}



//4. static 변수

public class Test {
	
	public static final int COUNT = 10;
	
}

//5. 메소드
//개선 불가능 오버라이드 불가능하게 만듦
public class Test {

 	final void show() {
 		System.out.println("Test");
 	}
 
}


public class Sample extends Test{

	//일반 메소드 오버라이드 가능
	@Override
	void aaa() {
		System.out.println("개선");
	}
	
	//final 메소드 오버라이드 금지
	private void show() { //error

	}
	
}

//6. class에도 final 키워드 적용가능 
// -> 상속 불가능

public final class First {

	void show() {
		System.out.println("First");
	}
	
}

public class Second extends First{ 
//error - final 클래스 상속 불가

}



이름 짓기 규칙

표기법예시
변수카멜표기법(명사)userName
메서드카멜표기법(동사)run()
클래스첫글자 대문자,파스칼 표기법Main
패키지전부소문자, 스네이크표기member_primery
상수전부 대문자, 스네이크표기USER_NUM
profile
보조기억장치

0개의 댓글