[Java]객체 지향 프로그래밍

young-gue Park·2023년 7월 21일
0

Java

목록 보기
5/11
post-thumbnail

⚡ 객체 지향 프로그래밍


📌 상속(inheritance)

🔷 어떤 클래스의 특성을 그대로 갖는 새로운 클래스를 정의한 것

  • 상위 클래스(부모 클래스, super class)에서 하위 클래스(자식 클래스, sub class)에게 공통된 변수나 메서드를 물려주는 것

🔷 extends 키워드를 통해 사용

public class Person {
	String name;
	int age;
	
	public void eat() {
		System.out.println("밥 먹어");
	}
}

public class Student extends Person{
//	String name;
//	int age;
	int degree;
	
	public void walk() {
		System.out.println("좀 걸어");
	}
}

🔷 상속의 특징

  1. 확장성, 재 사용성
  • 부모의 생성자와 초기화 블록은 상속 x
  1. 클래스 선언 시 extends 키워드를 명시
  • 자바는 다중 상속 허용 x, 단일 상속 지원

❗ 다중 상속이 허용된다면 super 클래스 끼리 멤버 변수나 메서드 명이 겹칠 때 sub 클래스에서의 판단이 모호해진다.

  1. 관계
  • 부모 (상위, Super) 클래스: Person
  • 자식 (하위, Sub) 클래스: Student
  1. 자식 클래스는 부모 클래스의 멤버변수, 메소드를 자신의 것처럼 사용할 수 있다.

    단, 접근 제한자에 따라 사용 여부가 달라진다.

  2. Object 클래스는 모든 클래스의 조상 클래스

  • 별도의 extends 선언이 없는 클래스는 extends Object가 생략
  1. super 키워드
  • super를 통해 조상 클래스의 생성자, 메서드 호출
public class Person {
	String name;
	int age;
	
    public Person(String name, int age) {
    	super(); // object 클래스의 생성자
    	this.name = name;
        this.age = age;
    }
    
	public void eat() {
		System.out.println("밥 먹어");
	}
}

public class Student extends Person{
	int degree;
	
    public Student(String name, int age, int degree) {
    	super(name, age);
        this.degree = degree;
    }
    
	public void walk() {
    	super.eat();
		System.out.println("좀 걸어");
	}
}

❗ super 키워드로 생성자를 불러올 때 그 위치는 생성자의 가장 위에 있어야 한다.

❗ super()와 this()는 같이 쓰일 수 없다!

⭐ 상속을 위해 기본 생성자 제작을 습관화하자.

  1. 오버라이딩 (재정의, overriding)
  • 슈퍼 클래스에서 쓰인 메서드를 서브 클래스에서 재정의하여 사용하는 것
  • 메서드의 이름, 반환형, 매개변수 (타입, 개수, 순서) 동일 해야 한다.
  • 하위 클래스의 접근 제어자 범위가 상위 클래스보다 크거나 같아야 한다.
  • 조상보다 더 큰 예외를 던질 수 없다.
  • 메서드 오버로딩과 혼동하지 말 것!
public class Person {
	String name;
	int age;
	
    public Person(String name, int age) {
    	this.name = name;
        this.age = age;
    }
    
	public void eat() {
		System.out.println("밥 먹어");
	}
}

public class Student extends Person{
	int degree;
	
    public Student(String name, int age, int degree) {
    	super(name, age);
        this.degree = degree;
    }
    
	public void walk() {
    	super.eat();
		System.out.println("좀 걸어");
	}
    
    public void eat() {
    	System.out.println("밥 말고 라면 먹어");
    }
}

📌 Object

🔷 가장 최상위 클래스이자 모든 클래스의 조상 클래스

  • Object의 멤버는 모든 클래스의 멤버
  1. toString()
  • 객체를 문자열로 변경하는 메서드
    public String toString() {
    	return getClass().getName()+"@"+Integer.toHexString(hashCode());
    }

    주소 값이 아닌 내용이 궁금한 경우, 오버라이딩

  1. equals()
  • 두 객체가 같은지를 비교하는 메서드

  • 비교 연산자 == 로 두 객체의 주소 값 비교

    public boolean equals(Object obj) {
    	return(this==obj);
    }

    ❗ String 클래스에서 이미 오버라이딩 되어 있기 때문에 여기서는 주소 값을 비교하지 않는다.

  1. hashCode
  • 객체의 해시 코드: 시스템에서 객체를 구별하기 위해 사용되는 정수값
  • HashSet, HashMap 등에서 객체의 동일성을 확인하기 위해 사용
  • eqauls 메서드를 재정의 할 때는 반드시 hashCode도 재정의 할 것
  • 미리 작성된 String이나 Number 등에서 재정의 된 hashCode 활용 권장

📌 final

  • 해당 선언이 최종 상태, 결코 수정 될 수 없음.
  • final 클래스: 상속 금지
  • final 메소드: 오버라이딩 금지
  • final 변수: 더 이상 값을 바꿀 수 없음 (상수화)

코로나로 아팠던 나,
그래도 이틀 강의 잘 들었다.

profile
Hodie mihi, Cras tibi

1개의 댓글

comment-user-thumbnail
2023년 7월 21일

아주 유익한 내용이네요!

답글 달기