[Java] 강의를 복습하면서...(2)

석연걸·2025년 1월 2일

객체지향 프로그래밍

  • 소프트웨어의 필요한 부품(객체)들을 만들고 하나씩 조립해 하나의 완성된 프로그램을 만드는 기법

캡슐화

  • 필드와 메서드를 하나로 묶어 객체로 만든 후 내부 구현 내용을 외부에서 알 수 없게 감춤 (보안 좋음)
  • 외부에서 해당 객체의 필드와 메서드를 변경하지 못하도록 함
  • 접근 제어자를 통해 해당 객체의 필드와 메서드를 노출시킬지 감출지 결졍

상속

  • 부모 객체가 가지고 있는 필드와 메서드를 자식 객체에게 주어 사용할 수 있도록 함
  • 자식 객체에선 부모의 필드와 메서드를 그대로 사용할지 변경할지 정할 수 있음
  • 코드의 중복이 줄어들고 재사용성이 증가함

다형성

  • 설계도에 따라 구현된 객체들은 메서드를 서로 다르게 재정의 하여 사용할 수 있다
  • 하나의 메서드를 여러가지 형태로 재구성하는 것을 의미

추상화

  • 객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것
  • 공통적이고 중요한 것들을 모아 객체를 모델링함

객체와 클래스

  • 클래스를 토대로 생성된 객체를 해당 클래스의 "인스턴스"라고 부르며 이 과정을 "인스턴스화"라고 한다
  • 동일한 클래스로 여러 개의 인스턴스를 만들 수 있다

생성자

  • 객체를 만들 때 어떻게 만들지 강제하는 것
  • 클래스와 이름이 같다
  • 리턴타입이 없다
  • this : 인스턴스 자신을 가르킨다

메서드 오버로딩 : 하나의 메서드 이름으로 여러 기능을 구현하는 것

  • 메서드의 이름이 같고, 매개변수의 개수, 타입, 순서가 달라야 한다 (매개변수 차이로만 구현)
  • 장점 : 메서드의 이름을 절약할 수 있다

매개변수

  • 기본형 매개변수 : 값 자체가 복사되어 넘어가기 때문에 매개값으로 지정된 변수의 원본 값이 변경되지 않는다
  • 참조형 매개변수 : 값이 저장된 곳의 원본 주소를 알고 있기 때문에 값을 읽기, 변경 가능
  • 예시
double brakePedal(char type) {
    speed = 0;
    type = 'P';
    changeGear(type);
    return speed;
}

Tire setTire(Tire tireCompany) {
    tireCompany.company = "KIA";
    tire = tireCompany;
    return tire;
}
    

// 기본형 매개변수
char type = 'D';
car.brakePedal(type);

// 메서드 실행 완료 후 전달할 매개값으로 지정된 type 값 확인
System.out.println("type = " + type); 
// 기존에 선언한 값 'D' 출력, 원본 값 변경되지 않음

// 메서드 실행 완료 후 반환된 car 인스턴스의 gear 타입 확인
System.out.println("gear = " + car.gear); 
// 객체 내부에서 type을 변경하여 수정했기 때문에 'P' 출력




// 참조형 매개변수
Tire tire = new Tire();
tire.company = "금호"; // 금호 타이어 객체 생성

// 차 객체의 타이어를 등록하는 메서드 호출한 후 반환값으로 차 객체의 타이어 객체 반환
Tire carInstanceTire = car.setTire(tire);

// 메서드 실행 완료 후 전달할 매개값으로 지정된 참조형 변수 tire의 company 값 확인
System.out.println("tire.company = " + tire.company); // "KIA" 출력
// 전달할 매개값으로 지정된 tire 인스턴스의 주소값이 전달되었기 때문에 호출된 메서드에 의해 값이 변경됨.

// 메서드 실행 완료 후 반환된 car 인스턴스의 tire 객체 값이 반환되어 저장된 참조형 변수 carInstanceTire의 company 값 확인
System.out.println("carInstanceTire.company = " + carInstanceTire.company); // "KIA" 출력

멤버 : 필드 + 메서드

  • 필드와 메서드는 선언하는 방법에 따라 인스턴스 멤버와 클래스 멤버로 구분할 수 있다.
  • 클래스 멤버로 선언된 메서드는 인스턴스 멤버를 사용할 수 없다.
  • 인스턴스 멤버로 선언된 메서드는 클래스 멤버를 사용할 수 있다.
  • 클래스 멤버는 객체 생성 없이 바로 사용가능 하기 때문에 객체가 생성되어야 하는 인스턴스 멤버를 사용할 수 없다.
  • 예시
String model = "GV80";
static String company = "GENESIS";

// 사용 가능
String getCompany() {
    return "(주)" + company;
}

// model이 인스턴스 필드이기 때문에 클래스 멤버 메서드에 사용 불가능
static String setCompany(String companyName) {
    // System.out.println("자동차 모델 확인: " + model);
    company = companyName;
    return company;
}
  • 인스턴스 멤버 : 객체 생성 후 사용 가능
    • 객체가 인스턴스화 될 때 매번 저장하지 않고, 메서드는 메서드 영역에 두고 모든 인스턴스들이 공유해서 사용
    • 대신 무조건 인스턴스를 통해서만 메서드가 사용될 수 있도록 제한을 걸어둠
  • 클래스 멤버 : 객채 생성 없이도 사용 가능
    • 메서드 영역의 클래스와 같은 위치에 고정적으로 위치하고 있는 멤버를 의미
    • 필드와 메서드를 클래스 멤버로 만들기 위해서는 static 키워드를 사용
    • Class.Field or Method() 로 객체 생성 없이 간단하게 사용 가능

지역변수

  • 해당 메서드가 실행될 때마다 독립적인 값을 저장하고 관리한다.
  • 메서드 내부에서 정의될 때 생성된다.
  • 메서드가 종료될 때 소멸된다.
  • 전역변수와 반대된다.

상수(final)

  • final 필드는 초기값이 저장되면 해당 값을 프로그램이 실행하는 도중에 절대 수정할 수 없다
  • 반드시 초기값을 지정해줘야 된다
  • 예시 : final String company = "GENESIS";

접근 제어자 : 폴더상에서 어디까지 접근을 허용할 것인가

  • public : 접근 제한이 전혀 없음(공개적)
  • protected : 같은 패키지 내에서 또는 다른 패키지의 자손 클래스에서 접근이 가능
  • default : 같은 패키지 내에서만 접근이 가능
  • private : 같은 클래스 내에서만 접근이 가능
  • 클래스 : public, default
  • 메서드 & 멤버변수 : public, protected, default, private
  • 그 외 제어자 : static, final, abstract

Getter

  • 외부에서 객체의 private 한 필드를 읽을 필요가 있을 때 사용

Setter

  • 외부에서 객체의 private 한 필드를 저장/수정할 필요가 있을 때 사용

0개의 댓글