본문 바로가기
[스파르타코딩클럽]/Java 문법 종합반

Chapter 7. 클래스

by 진진리 2023. 10. 16.
728x90

객체지향 프로그래밍

  • 객체: 세상에 존재하는 물체. 식별이 가능한 것.
    • 객체: 속성(필드) + 행위(메서드)
    • 객체 모델링: 현실 세계에 있는 객체를 소프트웨어의 객체로 설계하는 것
  • 객체 간 상호작용: 메서드를 통해 이루어짐
  • 객체 간 관계
    • 사용 관계
    • 포함 관계
    • 상속 관계
  • 객체지향 프로그래밍의 특징
    • 캡슐화: 필드와 메서드를 하나로 묶어 객체로 만든 후 실제 내부 구현은 외부에서 알 수 없게 감추는 것
      • 캡슐화된 객체의 필드와 메서드를 노출 시킬 지 감출 지 결정하기 위해 접근 제어자 사용
    • 상속: 부모 객체의 필드와 메서드를 자식 객체에 물려주는 것
      • 객체들을 상속 관계로 묶음으로써 객체 간의 구조를 파악하기 쉬워짐
      • 부모 객체의 필드와 메서드를 수정하면 자식 객체에 모두 반영되어 일관성을 유지하기 좋음
      • 코드의 중복이 줄어들어 코드의 재사용성이 증가
    • 다형성: 하나의 행위에 대해 각 객체가 가지고 있는 고유한 특성에 따라 재구성되는 것
      • 같은 메서드의 구현을 다르게 재정의하여 사용 가능
    • 추상화: 객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것
  • 객체와 클래스
    • 클래스: 객체의 설계도
    • 인스턴스: 클래스를 토대로 생성된 객체
    • 인스턴스화

 

클래스 설계

  1. 클래스 선언
    • public class Car { }
  2. 클래스 필드 정의
    • String company;
    • double speed; 등
  3. 클래스 생성자 정의
    • public Car() { }: 반환 타입이 없고 클래스의 이름과 동일
    • ()안에 아무것도 없는 생성자는 기본 생성자(생략 가능)
  4. 클래스 메서드 정의
    • double gasPedal(double kmh) { speed = kmh; return speed; } 

 

객체 생성과 참조형 변수

  • Car car1 = new Car(); //Car클래스의 객체인 car1 인스턴스 생성
  • 객체 생성 동시에 기본 생성자가 호출
  • 객체는 참조형 변수와 동일하게 취급되므로 배열 또는 컬렉션에 저장하여 관리 가능

 

  • 객체의 속성: 필드
    • 필드: 객체의 데이터를 저장
    • 고유 데이터, 상태 데이터, 객체 데이터로 분류 가능
    • 필드들은 초기값을 제공하지 않을 경우 객체 생성 시 자동으로 기본값으로 초기화됨
    • 필드 사용방법: 
      1. 외부 접근: car.color = "blue" (도트 연산자 사용)
      2. 내부 접근: color (바로 호출)

 

  • 객체의 행위: 메서드
    • 메서드 선언: 리턴타입 메서드명(매개변수, ...) { }
    • 매개변수
      • void carSpeed(double ... speeds) { for (double v : speeds) {}}
      • 이렇게 ...을 사용하면 매개값을 개수 상관없이 전달 가능
    • 매서드 호출방법:
      1. 외부 접근: car.brakePedal(); (도트 연산자 사용)
      2. 내부 접근: 메서드 내에서 brakePedal(); 등으로 호출
    • 메서드 오버로딩: 한 클래스 내에 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입, 순서가 다르면 동일한 이름으로 메서드 정의 가능

 

멤버: 필드, 메서드

  • 인스턴스 멤버 = 인스턴스 필드 + 인스턴스 메서드
    • 객체 생성 후에 사용 가능
    • 객체의 인스턴스 필드는 각각의 인스턴스마다 고유한 값을 가질 수 있음
    • 객체의 메서드는 메서드 영역에 두고 모든 인스턴스들이 공유 - 인스턴스를 통해서만 메서드 사용 가능
  • 클래스 멤버 = 클래스 필드 + 클래스 메서드
    • 클래스는 클래스 로더에 의해 메서드 영역에 저장되고 사용됨
    • 클래스 멤버는 클래스와 같은 위치에 고정적으로 위치하고 있는 멤버
    • 객체 생성 없이도 사용 가능
    • 클래스 멤버 선언: static 사용 : 인스턴스의 공용적인 데이터를 저장하는 필드 일 때
    • 클래스 멤버 사용: 클래스명.클래스 멤버
  • 인스턴스 멤버인 메서드는 클래스 멤버 사용 가능
  • 클래스 멤버인 메서드는 인스턴스 멤버 사용 불가능
  • 지역 변수: 메서드 내부에 선언한 변수. 메서드 종료될 때까지만 유지됨
  • final 필드: 초기값을 반드시 지정. 수정 불가능
  • 상수: static final로 모든 인스턴스가 공유하면서 불변인 상수 선언. 일반적으로 대문자로 작성.

 

 

생성자

  • 기본 생성자
    • 모든 클래스는 반드시 생성자가 하나 이상 존재
    • 생성자가 선언되지 않은 경우 컴파일러가 기본 생성자를 바이트 코드 파일에 자동으로 추가시켜줌 (기본 생성자 생략 가능)
    • 생성자가 하나라도 선언되었다면 컴파일러가 기본 생성자를 추가하지 않음 (기본 생성자가 없으면 오류)
    • 컴파일러가 생성한 기본 생성자는 해당 클래스의 접근 제어자를 따름
  • 생성자의 역할: 객체의 필드 초기화

 

this와 this()

  • this: 인스턴스 자신을 표현
    • 매개변수명과 객체의 필드명이 동일한 경우 this 키워드 사용
  • this(): 인스턴스 자신의 생성자를 호출
    • 객체 내부 생성자 및 메서드에서 사용될 수 있음
    • 다른 생성자를 호출할 때는 반드시 해당 생성자의 첫 줄에 작성되어야 함

 

접근 제어자

  • 제어자: 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미 부여
    • 접근 제어자: public, protected, default, private
    • 그 외 제어자: static, final, abstract
  • 접근 제어자: 멤버 또는 클래스에 사용하여 외부에서 접근하지 못하도록 제한
    • 지정되어 있지 않다면 default
    • public: 접근 제한 없음
    • protected: 같은 패키지 내에서, 다른 패키지의 자손 클래스에서 접근 가능
    • default: 같은 패키지 내에서만 접근 가능
    • private: 같은 클래스 내에서만 접근 가능
  • 접근 제어자는 클래스 내부에 선언된 데이터를 보호하기 위해 사용(무결성)
  • 생성자에 접근 제어자를 사용해 인스턴스의 생성을 제한
    • 일반적으로 생성자의 접근 제어자는 클래스의 접근 제어자와 일치
  • 객체의 private 필드를 읽거나 저장하는 방법: Getter와 Setter
    • Getter: 읽을 때
      • (public) 메서드 이름 규칙: get+필드 이름(첫 글자 대문자)
    • Setter: 저장/수정할 때
      • (public) 메서드 이름 규칙: set + 필드 이름(첫 글자 대문자)
// Getter
public Stirng getColor() {
    return color;
}

// Setter
public void setColor(String color) {
    this.color = color;
}
  • 제어자의 조합 (사용가능한 제어자
    • 클래스 : public, default, final, abstract
    • 메서드 : public, protected, default, private, final, abstract, static
    • 멤버변수 : public, protected, default, private, final, static
    • 지역변수 : final
  • 제어자 주의 사항
    • 메서드에 static과 abstract를 함께 사용할 수 없다.
    • 클래스에 abstract와 final을 동시에 사용할 수 없다.
    • abstract메서드의 접근 제어자가 private일 수 없다.
    • 메서드에 private와 final을 같이 사용할 필요는 없다.

 

package와 import

  • 상위 패키지와 하위 패키지를 도트(.)로 구분
  • import: 다른 패키지에 있는 클래스를 사용하기 위해 명시하는 키워드
  • 서로 다른 패키지에 있는 같은 이름의 클래스를 동시에 사용하려면 패키지명을 전부 명시해야 함

 

'[스파르타코딩클럽] > Java 문법 종합반' 카테고리의 다른 글

Chapter 9. 인터페이스  (0) 2023.10.17
Chapter 8. 상속  (0) 2023.10.16
Chapter 6. 컬렉션  (0) 2023.10.13
Chapter 5. 배열  (0) 2023.10.13
Chapter 4. 조건문, 반복문  (0) 2023.10.13