내배캠 강의를 수강하며 객체지향에 관련된 모르는 부분 및 알아야 되는 내용을 정리하려고 한다.
1. 객체
- 객체는 세상에 존재하는 물체를 뜻하며 식별이 가능한 것을 의미한다.
- 예를 들자면 물리적으로 존재하는 자동차, 도서관, 계산기를 객체라 볼 수 있다.
- 강의, 배달 주문, 운동과 같은 개념적인 것 또한 식별이 가능하기 때문에 객체라 볼 수 있다.
클래스 객체 생성 및 참조형 변수
Car car1 = new Car(); // Car클래스의 객체인 car1 인스턴스 생성
Car car2 = new Car(); // Car클래스의 객체인 car2 인스턴스 생성
new 연산자를 통해서 객체가 생성되면 해당 인스턴스의 주소가 반환되기 때문에 해당 클래스의 참조형 변수를 사용하여 받아줄 수 있다.
2. 필드
- 필드는 객체의 데이터를 저장하는 역할
- 객체의 필드는 고유한 데이터, 상태 데이터, 객체 데이터로 분류 가능
- 우리가 클래스에 필드를 정의하여 선언했다고 해서 바로 사용할 수 있는 것은 아니다.
- 클래스는 설계도일 뿐 실제로 필드의 데이터를 가지고 있는 것은 객체이다.
- 따라서 객체를 생성한 후에 필드를 사용할 수 있습니다.
- 필드를 사용한다’라는 의미는 필드의 값을 변경하거나 읽는 것을 의미한다.
필드의 데이터
3. 생성자
- 객체 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화가 가능한 메서드
- 생성자는 반환 타입이 없고 이름은 클래스의 이름과 동일
- 괄호( ) 안에 아무것도 없는 생성자를 기본 생성자라 한다.
생성자 형식
public class Test {
public Test() {}
}
4. 기본형 & 참조형 매개변수
기본형 매개변수
- 메서드를 호출할 때 전달할 매개값으로 지정한 값을 메서드의 매개변수에 복사해서 전달한다.
- 매개변수의 타입이 기본형일 때는 값 자체가 복사되어 넘어가기 때문에 매개값으로 지정된 변수의 원본 값이 변경되지 않는다.
5. 오버로딩
- 오버로딩 은 함수가 하나의 기능만을 구현하는 것이 아니라 하나의 메서드 이름으로 여러 기능을 구현하도록 하는 Java의 기능
- 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도, 매개변수의 개수 또는 타입, 순서가 다르면 동일한 이름을 사용해서 메서드를 정의할 수 있다.
오버로딩 조건
- 메서드의 이름이 같고, 매개변수의 개수, 타입, 순서가 달라야 한다.
- '응답 값만' 다른 것은 오버로딩을 할 수 없다.
- 접근 제어자만 다른 것도 오버로딩을 할 수 없다.
- 결론, 오버로딩은 매개변수의 차이로만 구현할 수 있다.
장점
- 메서드 이름 하나로 상황에 따른 동작을 개별로 정의할 수 있다.
- 메서드의 이름을 절약할 수 있다.
예시
public void Test(int x)
{
System.out.println("x 출력" + x);
}
public void Test(double x)
{
System.out.println ("x 출력" + x);
}
public void Test(int x , double y)
{
System.out.println ("x 출력" + x + "y 출력" + y);
}
6. this 와 this()
- this는 객체 즉, 인스턴스 자신을 표현하는 키워드이다.
- 객체 내부 생성자 및 메서드에서 객체 내부 멤버에 접근하기 위해 사용될 수 있다.
- 객체 내부 멤버에 접근할 때 this 키워드가 필수는 아니지만 상황에 따라 필수가 될 수 있다.
this를 써야하는 이유
public Car(String model, String color, double price) {
model = model;
color = color;
price = price;
}
- 만약 이처럼 생성자를 선언하는데 매개변수명과 객체의 필드명이 동일할 경우 오류가 발생하지는 않지만 생성자 블록 내부에서 해당 변수들은 객체의 필드가 아닌 가장 가까운 매개변수명을 가리키게 됨으로 자기 자신에게 값을 대입하는 상황이 되어 버린다.
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
- this 키워드를 통해 변수명에 해당하는 객체의 필드에 접근하여 받아온 매개변수의 매개값을 객체의 필드에 대입하여 저장할 수 있다.
- 또한 this는 인스턴스 자신을 뜻하기 때문에 객체의 메서드에서 리턴타입이 인스턴스 자신의 클래스 타입이라면 this를 사용하여 인스턴스 자신의 주소를 반환할 수도 있다.
7. 접근 제어자
제어자는 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여해 준다.
- 접근 제어자 : public, protected, default, private
- 그 외 제어자 : static, final, abstract
하나의 대상에 여러 개의 제어자를 조합해서 사용할 수 있으나, 접근 제어자는 단 하나만 사용할 수 있다.
멤버 또는 클래스에 사용, 외부에서 접근하지 못하도록 제한
- 클래스, 멤버변수, 메서드, 생성자에 사용되고, 지정되어 있지 않다면 default 이다.
- public : 접근 제한이 전혀 없다.
- protected : 같은 패키지 내에서, 다른 패키지의 자손클래스에서 접근이 가능
- default : 같은 패키지 내에서만 접근이 가능
- private : 같은 클래스 내에서만 접근이 가능
- 사용가능한 접근 제어자
- 클래스 : public, default
- 메서드 & 멤버변수 : public, protected, default, private
- 지역변수 : 없음
- 접근 제어자를 이용한 캡슐화 (은닉성)
- 접근제어자는 클래스 내부에 선언된 데이터를 보호하기 위해서 사용
- 유효한 값을 유지하도록, 함부로 변경하지 못하도록 접근을 제한하는 것이 필요
- 생성자의 접근 제어자
- 생성자에 접근 제어자를 사용함으로 인스턴스의 생성을 제한할 수 있다.
- 일반적으로 생성자의 접근 제어자는 클래스의 접근 제어자와 일치