본문 바로가기
Java/자바의정석

JAVA _객체지향언어 개념 -2- (자바의정석 7장)

by 유서담 2023. 7. 17.

상속 ( EX : Child extends Parent )

  • 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것 ( 앞에서 말한 코드의 재사용)
  • 두 클래스를 부모와 자식으로 관계를 맺어준다
  • 자손 클래스는 조상의 모든 멤버를 상속받는다
    • 생성자와 초기화블럭은 예외 . / 상속받지 않음.
  • 자손 클래스는 조상클래스보다 멤버의 개수가 같거나 많다 ( 적을수 없다)

포함관계

  • 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수로 선언하는 것
    • class Point {int y;
    • int x;
    }
    • class Circle {int r;
    • Point c = new Point();
    }
  • 관계 설정시 상속인지 모를 경우
    • is ~ a / ~는 ~다 : 상속관계
    • has ~ a / ~는 ~을 갖고 있다 : 포함관계
    • 90%는 포함관계이다

단일상속

  • JAVA는 오직 단일상속(하나의 부모만 상속받는 것)만을 허용한다
  • 비중이 높은 클래스만 상속받고 나머지는 포함관계이다

Object 클래스

  • 모든 클래스의 조상
  • 부모가 없는 클래스는 자동으로 Object를 상속하게 된다
  • 모든 클래스는 Object의 정의된 11개의 메서드를 상속받는다

오버라이딩

  • 상속받은 메서드의 내용을 자신에 맞게 변경하는 것

오버라이딩 조건

  • 선언부가 조상과 일치해야한다
  • 접근제어자를 조상클래스보다 좁은 범위로 변경 불가
  • 조상메서드보다 예외를 많게 선언할 수 없다

오버로딩과 차이점

  • 오버로딩은 자손에 없는 새로운 메서드를 정의 하는것 / 이름이 같고 매개변수가 다르다 ( new )
  • 오버라이딩은 상속받은 메서드의 내용을 변경해서 사용 ( change / modify )

참조변수 super

  • 참조변수 this와 비슷하다. 인스턴스 자신을 가리키는 참조변수
  • 인스턴스 주소가 저장되어 있다
  • 조상의 멤버와 자신의 멤버의 이름이 같을 때 구분하기 위해서 사용

super () - 조상생성자

  • 조상의 생성자를 호출할때 사용한다.
    • 생성자와 초기화 블럭은 상속이 안되기 때문
  • 조상의 멤버는 조상의 생성자를 호출해서 초기화
    • 조상의 멤버는 조상 본인이 초기화를 해야한다.
  • 모든 클래스 생성자의 첫 줄에 반드시 생성자를 호출해야한다. 그렇지 않으면 컴파일러가 생성자의 첫줄에 super()를 삽입한다

패키지 ( 클래스 묶음)

  • 클래스는 클래스 파일( *.class ) , 패키지는 폴더 / 하위패키지는 하위 폴더
  • 클래스의 실제 이름은 패키지를 포함하고 있다
    • java.lang.string
  • 패키지의 선언 : package 패키지이름 ;
  • 같은 소스파일의 클래스들은 모두 같은 패키지에 속하게 된다

클래스패스(환경변수)

  • 클래스 파일( *.class ) 위치를 알려주는 경로
  • 환경변수로 관리하여 경로간 구분을 ‘;’ (세미콜론) 을 사용한다 / 환경변수에 패키지 루트를 등록.

import문 ( ctrl + shift + o )

  • 클래스를 사용할 때 패키지 이름을 생략할 수 있다
  • 컴파일러에게 클래스가 속한 패키지를 알려준다
  • 선언 방법
    • import 패키명.클래스명
    • java.lang 패키지 클래스는 import 없이도 사용가능 ( string , system , 1hread )
  • 이름이 같은 클래스와 속한 두 패키지를 import 할 때는 클래스 앞에 패키지명
  • import문 충돌시 코드에서 직접 지정해줘야 한다

static import문

  • static 멤버를 사용할 때 클래스 이름을 생략하게 해준다
    • Ex ) import static java.lang.Inteager;
    • Ex ) import static java.lang.Math.random;
    • Ex ) import static java.lang.System.out;
    • System.out.println(Math.random()); ⇒ out.println(random () );

제어자

  • 클래스 , 변수 , 메서드 선언부에 사용되어 부가적인 의미를 부여한다
  • 접근제어자 : public > protected > ( default ) > private
  • 그 외 : static , final , abstract 등
  • 하나의 대상에 여러제어자를 조합하여 사용가능
    • 접근제어자는 1개만 가질 수 있다
  • 접근제어자를 맨 왼쪽에 놔야한다

Static : 클래스의 , 공통적인

  • static은 멤버변수, 메서드, 초기화블럭에서 사용 ( 객체 생성 없어도 ) / 공통값을 가진다
  • static은 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.

final : 마지막의 , 변경될 수 없는

  • 클래스 : 변경 , 확장이 불가능한 클래스 / 상속계층도의 제일 마지막 / 자손없는 클래스
  • 메서드 : 오버라이딩이 불가능한 메서드 ( 변경될 수 없는 )
  • 변수 : ( iv , lv ) 상수

abstract : 추상 , 미완성

  • 클래스 : 클래스안에 추상메서드가 있음을 의미 ( 미완성 설계도 )
  • 메서드 : 선언부만 있고 { 구현부 } 가 없는 메서드 ( 추상 메서드 )
  • abstract 클래스는 객체를 생성할 수 없고, 추상메서드를 갖고 있으니 상속받아서 완성해줘야 하는구나를 알려준다

접근제어자

제어자 같은클래스 같은패키지 자손클래스 전체

public
protected  
(default)    
private      
  • 접근범위
    • public > protectd > ( default ) > private
    • 제한x > 같은패키지 + 다른패키지 자손 > 같은 패키지 > 같은 클래스
  • 접근제어자를 사용하는 이유
    • 외부로부터 데이터를 보호하기 위해서
    • 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서

다형성

  • 조상타입의 참조변수로 자손타입 객체(인스턴스)를 다루는 것
  • 참조변수 타입에 따라 인스턴스의 사용할 수 있는 멤버의 개수가 달라짐 ( 자손의 멤버보다 같거나 적어야함 )
  • 하나의 배열에 여러종류의 객체를 저장
  • 참조변수 타입과 인스턴스 타입은 보통 일치하지만 일치하지 않을 수 있음

참조변수의 형변환 ( 리모콘을 변경함으로서) 사용할 수 있는 멤버이 개수를 조절하는 것

  • 조상 , 자손관계의 참조변수는 서로 형변환이 가능하다
  • 리모콘 기능이 많은쪽에서 적은쪽으로 줄이는건 자동형변환이 가능하다
  • 적은쪽에서 많은 쪽으로 형변환을 할때는 자동형변환 X

instanceof 연산자

  • 참조변수의 형변환 가능여부를 체크하는 연산자
    • 형변환이 가능하면 True를 반환한다
  • 형변환 전에 반드시 instanceof로 형변환이 가능한지 확인해봐야한다
  • 주로 조건식에 사용한다 if ( 참조변수 instanceof 타입 클래스명 )

매개변수의 다형성

  • 참조형 매개변수는 메서드 호출시 자신과 같은타입 또는 자손타입의 인스턴스로 넘겨줄 수 있다

여러종류의 객체를 배열로 다루기

  • 조상 타입의 배열에 자손타입의 객체를 담을 수 있다
  • 다루고 싶은 객체들의 상속관계를 따져서 가장 가까운 공통조상 클래스타입의 참조변수 참조변수 배열을 생성해서 객체들을 저장