<생성자>
Constructor. 객체가 생성(new)될 때 호출되며, 객체를 초기화하는 역할을 하며, 부가적인 역할도 함.
모든 클래스는 반드시 생성자가 있어야함 (안만들어주면 컴파일러가 기본생성자로 만들어줌)
컴파일러에 의해 생성되는 기본 생성자는 해당 클래스의 접근제어자를 따라간다.
생성자도 오버로딩 가능
<this>
자기 자신(인스턴스)를 가리키는 변수.
왜 ? 생성자에서 생성할 때, 클래스에서 정한 변수명과 파라미터로 정한 변수명이 겹칠 경우가 있음
public ClimbingGym(String name){
this.name = name
}
이런식으로 this 써준다. 생성자에서 필드변수를 가리키는 경우에는 this.변수명 으로 써주는게 국룰
오버로딩에서도 많이 활용된다.

this는 Car를 가리키므로 this()는 즉 Car()와 같다. Car 클래스의 생성자를 호출하는 것.
<제어자>
제어자는 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여함
접근 제어자 : public // protected // default // private
그 외 제어자 : static // final // abstract
public : 접근 제한이 전혀 없음
protected : 같은 패키지 내에서 + 다른패키지의 자손클래스에서 접근 가능
default : 같은 패키지 내에서만 접근 가능
private : 같은 클래스 내에서만 접근 가능
클래스에 사용 가능한 접근제어자 : public // default
메서드 & 멤버변수에 사용 가능 : public // protected // default // private
메서드에 static과 abstract를 동시에 사용 불가
클래스에 abstract와 final을 동시에 사용 불가
abstract메서드의 접근 제어자가 private일 수 없다
메서드에 private과 final을 같이 사용할 필요는 없다
접근제어자는 객체의 무결성 즉, 변경이 없는 상태를 유지하기 위해 사용한다.
외부에서 필드에 접근하는 것을 막기 위해 필드에 private, default 등의 접근 제어자를 사용할 수 있다.
==>제어자때문에 나오는 개념이 ★★★★★Getter // Setter★★★★★
<Getter & Setter>
★ getter와 setter는 직접적인 값의 조회와 세팅을 방지하기 위해 사용됨 !!
보통 하나의 필드마다 getter와 setter가 존재함 getColor(), setColor() 와 같이 camelCase로 선언하는게 국룰
예를들어, double type으로 선언한 age필드에 누가 person.age = "27살" 이런식으로 값을 직접 바꾸게되면 안되기때문에 setAge() 같은 public한 setter 메소드를 사용해 값을 변경하도록 하고, 그 안에 특정한 로직을 담게된다.
외부에서 객체의 private한 필드를 읽을 필요가 있을 때 Getter 메서드를 사용. Getter를 이용해 내부 로직을 숨기면서, 내보내야 하는 정보만 내보낼 수 있다.
<상속>
부모클래스를 상속받은 자식클래스는 부모클래스의 필드나 메서드를 사용할 수 있다.
상속을 사용하면 코드의 중복이 제거되고, 재사용성이 크게 증가하여 생산성과 유지보수성에 매우 유리해진다.
상속 keyword : extends
public class 자식클래스 extends 부모클래스 { }
-부모클래스에 새로운 필드와 메서드가 추가되면 자식클래스는 이를 상속받아 사용할 수 있다.
-자식클래스에 새로운 필드와 메서드가 추가되어도 부모클래스는 어떠한 영향도 받지 않는다.
-따라서 자식 클래스의 멤버 개수는 부모클래스보다 항상 같거나 많다.
★Java는 다중상속을 허용하지 않음 : 클래스간의 관게가 복잡해지기 때문
★부모 클래스에 final인 멤버가 있으면 상속 불가 : 변경 불가하기 때문에 override할 수 없기때문
★overload : 클래스 내에 같은 이름의 메소드를 여러가지로 정의 // override : 부모클래스의 메서드를 재정의
<추상 클래스>
-미완성된 설계도. 부모는 완성시키지 않은 method를 가지고 있고, 자식은 이를 상속받아서 완성시킴
- abstract 키워드를 class 앞에 넣어줘서 사용
eg) public abstract class 추상클래스명; ==> {}가 없고, 세미콜론으로 선언만 함
1. 추상 클래스는 추상 메서드를 포함할 수 있다 (없어도 선언 가능하긴함)
2. 추상 클래스는 자식 클래스에 상속되어서 자식 클래스에 의해서만 완성될 수 있음
3. 추상 클래스는 여러개 자식클래스 중에서 공통적인 필드나 메서드를 추출해서 만들 수 있다.
부모클래스를 자식들이 가져다 쓴다는 느낌보다, 자식클래스들의 공통된 특징을 묶어주는 느낌이 강하다(추상화)
상속받은 클래스에서 추상 클래스의 추상 메서드는 반드시 오버라이딩 되어야 한다(인터페이스와 다른 점)
<Interface>
두 객체를 연결해주는 다리.
- 상속관계가 없는 다른 클래스들이 서로 동일한 메서드를 구현해야할 때 인터페이스는 구현 클래스들의 동일한 사용 방법과 행위를 보장해줄 수 있다.
예를들어, 멀티 리모컨 인터페이스를 통해 삼성티비 객체, LG티비 객체의 채널을 변경할 수 있음
interface 키워드로 선언하며, public interface 인터페이스명{ } 과 같은 형태가 됨. public // default 접근자 지정 가능
1. 인터페이스의 모든 멤버 변수는 public static final : *생략가능 -생략시 컴파일러가 자동으로 추가
2. 인터페이스의 모든 메서드는 public abstract : *생략가능-생략시 컴파일러가 자동 추가(static, default 메서드 제외)
3. 생략되는 제어자는 컴파일러가 자동으로 추가해줌
- 인터페이스는 추상 클래스와 마찬가지로 직접 인스턴스를 생성할 수 없어, 클래스에 구현되어 생성된다.
public class 클래스명 implements 인터페이스명{
@Override
public 리턴타입 메서드이름(매개변수 ...{
//실행문
}
}
- 인터페이스의 추상 메서드는 구현될 때 반드시 오버라이딩 되어야 함. (안하면 컴파일 시 오류 발생)
- 인터페이스의 추상 메서드를 일부만 구현해야 한다면, 해당 클래스를 추상 클래스로 변경해주면 된다
==> implements 받는 클래스를 추상클래스로 선언한 뒤, 이것을 필요한 클래스에 상속해서 override
- 인터페이스 간의 상속이 가능하다. 인터페이스간의 상속은 extends 키워드를 사용하며, 다중상속 가능
===========Interface의 default, static 메서드=============
--------------interface의 디폴트 메서드----------------
-디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드.
-default 역시 접근 제어자가 public이며, 생략 가능
-추상 메서드가 아니기때문에 인터페이스의 구현체들에서 필수로 재정의할 필요는 없다.
--------------interface의 static 메서드----------------
-static 메서드의 경우, interface에 바로 접근 가능.
-이유 : static 메서드는 compile 단계에서 생성되기 때문에 구현체를 선언하지 안하도 쓸 수 있다.
<인터페이스의 다형성>
A가 interface, B는 interface를 implement받은 객체라고 할 때,
A a1 = new B(); 를 하면 B라는 구현체가 A로 형변환 일어나게 된다.
C는 구현체 B를 상속받은 객체라고 할 때,
A a2 = new C(); 를 하면 C가 A로 형변환됨.
'공부 > Java' 카테고리의 다른 글
Java - 오류 및 예외 처리 // 예외 클래스 구조 // 제네릭 문법 (0) | 2023.04.07 |
---|---|
Java 문법 (4) - 상속관련 super // override // 다형성 // 추상클래스 (0) | 2023.04.05 |
Java문법 (2) - 클래스 // 객체 // 메서드 (0) | 2023.04.05 |
Java 문법 - 연산자 // 반복문 // 배열 // 컬렉션 (0) | 2023.04.04 |
Java 개요 // JVM // 저장공간 // 변수와 상수 // 형변환 (0) | 2023.04.03 |