2월 27일 상속과 캡슐화 요약정리.
기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소를 의미.
하위 클래스가 상위 클래스가 가진 모든 멤버를 상속받게 된다.
따라서 하위 클래스의 멤버 개수는 언제나 상위 클래스의 그것과 비교했을 때 같거나 많다.
또한, "~클래스로부터 상속받았다"라는 표현보다는 "~클래스로부터 확장되었다"는 표현이 그 역할과 기능을 생각했을 때 더 적절한 표현
extendS
키워드 사용
코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거
클래스를 상속할 때에는 extends
키워드를 사용하며, 클래스명 다음에 extends 상위 클래스명
을 사용하여 정의
자바의 객체지향 프로그래밍에서는 단일 상속(single inheritance)만을 허용한다. 다른 말로, 다중 상속은 허용되지 않는다. > 인터페이스 등으로 다중 상속과 비슷한 효과를 낼 수 있다.
다형성: 하나의 객체가 여러 모양으로 표현될 수 있는 것
포함(composite)은 상속처럼 클래스를 재사용할 수 있는 방법으로, 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것을 의미
클래스 간의 관계를 설정하는 데 있어서 상속관계를 맺어 줄 것 인지 포함 관계를 맺어 줄 것인지를 어떤 기준으로 판별할 수 있을까?
가장 손쉬운 방법은 클래스 간의 관계가 ‘~은 ~이다(IS-A)’ 관계인지 ~은 ~을 가지고 있다(HAS-A) 관계인지 문장을 만들어 생각해보는 것이다.
메서드 오버라이딩(Method Overriding)은 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것을 의미
상위 클래스의 메서드를 오버라이딩하려면 다음의 세 가지 조건을 반드시 만족
1. 메서드의 선언부(메서드 이름, 매개변수, 반환타입)이 상위클래스의 그것과 완전히 일치해야한다.
2. 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.
3. 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.
this
는 자기 객체를 가리키는 참조 변수명으로 메서드 내에서 멤버변수와 지역 변수의 이름이 같을 때 구분하기 위한 용도로 사용되며 생략 시 컴파일러가 자동으로 추가
this()
메서드는 같은 클래스의 다른 생성자를 호출하는데 사용되며 생성자 내에서만 사용가능하고 항상 첫 줄에 위치해야한다
= this는 자신의 객체, this() 메서드는 자신의 생성자 호출
super
키워드는 상위 클래스의 객체, super()
는 상위 클래스의 생성자를 호출하는 것을 의미한다. 공통적으로 모두 상위 클래스의 존재를 상정하며 상속 관계를 전제한다.
super
키워드를 붙이지 않는다면, 자바 컴파일러는 해당 객체는 자신이 속한 인스턴스 객체의 멤버를 먼저 참조한다.super()
도 this()
메서드처럼 생성자를 호출할 때 사용한다.
그리고 마찬가지로, this()
와의 차이는 this()
가 같은 클래스의 다른 생성자를 호출하는데 사용하는 반해, super()
는 상위 클래스의 생성자를 호출하는데 사용된다.
super()
메서드 또한 this()
와 마찬가지로 생성자 안에서만 사용가능하고, 반드시 첫 줄에 와야 한다.Object 클래스는 자바의 클래스 상속계층도에서 최상위에 위치한 상위클래스다. 따라서 자바의 모든 클래스는 Object 클래스로부터 확장된다는 명제는 항상 참이다.
자바 컴파일러는 컴파일 과정에서 다른 클래스로부터 아무런 상속을 받지 않는 클래스에 자동적으로 extends Object
를 추가
하여 Object 클래스를 상속받도록 한다.
대표적인 메소드들
1. toString() : String 타입을 반환한다. 객체 정보를 문자열로 출력한다.
특정 객체 안에 관련된 속성과 기능을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것
특정한 목적을 공유하는 클래스와 인터페이스의 묶음
자바에서 패키지는 물리적인 하나의 디렉토리(directory)이고, 하나의 패키지에 속한 클래스나 인터페이스 파일은 모두 해당 패키지에 속해있다.
package 패키지명
이 표시되어야 하고, 만약 패키지 선언이 없으면 이름없는 패키지에 속하게 된다.java.lang : 자바의 기본 클래스들을 모아놓음
java.util : 확장 클래스를 묶어 놓음
java.io / java.nio : 자바의 입출력과 관련된 클래스들
= 우리가 주로 사용하는 String
클래스의 실제 이름은 java.lang.String인데, 여기서 java.lang
은 패키지명을 나타내고 점(.)을 사용하여 디렉터리 계층구조를 나타내고 있다.
import문은 다른 패키지 내의 클래스를 사용하기 위해 사용하며, 일반적으로 패키지 구문과 클래스문 사이에 작성한다.
import 패키지명.클래스명; 또는 import 패키지명.*;
import문을 사용하지 않고 다른 패키지의 클래스를 사용하기 위해서는 패키지명을 모두 포함시켜서 클래스의 패키지에 대한 정보를 제공해야한다
import 패키지명.*
으로 작성하면 해당 패키지의 모든 클래스를 패키지명 없이 사용가능= 클래스, 필드, 메서드, 생성자 등에 부가적인 의미를 부여하는 키워드를 의미한다. (형용사의 역할)
= 클래스 외부로의 불필요한 데이터 노출을 방지한다.
= 외부로부터 데이터가 임의로 변경되지 않도록 막을 수 있다.
public(접근 제한 없음) > protected(동일 패키지 + 하위클래스) > default(동일 패키지) > private(동일 클래스)
객체지향의 캡슐화의 목적을 달성하면서도 데이터의 변경이 필요한 경우 ex) private 접근 제어자가 포함되어 있는 객체의 변수의 데이터값을 추가하거나 수정하고 싶을 때
set-
인텔리제이 generate alt+ insert 입력시 getter setter 안나오는 이유
1. 롬복 라이브러리 사용 후 객체에 @Getter 선언하면 자동으로 생성된다.
2. 마우스 위치 문제. 코드영역을 다시 확인해보자
https://www.inflearn.com/questions/469584/getter-setter-인텔리제이에서-만드는-법