자바_04 클래스

aggapang·2025년 4월 28일

kb IT's Your Life

목록 보기
12/20

객체 지향 프로그래밍 (OOP)

객체

  • 프로그램 안에서 필드(데이터, 속성)메소드(기능, 동작)을 가진 어떤 역할을 하는 존재

객체 지향 프로그래밍(OOP)

  • 여러개의 객체들을 생성하고 객체들을 하나씩 조립해서 프로그램을 완성하는 기법

특징

설명
캡슐화객체의 필드, 메소드를 하나로 묶고 구현 내용을 외부에 감춤
-> 외부는 객체의 사용 방법만 알고 내부 동작은 모름
상속부모 객체가 자기 필드와 메소드를 자식 객체에 물려줄 수 있음
-> 코드 재사용성 증가, 유지보수 시간 단축
다형성같은 타입이라도 실행 결과가 다양할 수 있음
->상황에 따라 객체가 다양한 형태로 동작 가능

객체의 상호작용

  • 객체들끼리 서로 메소드를 호출하거나 데이터를 주고받으며 프로그램을 동작
  • 구분설명
    매개값메소드 호출시, 객체가 전단하는 데이터
    메소드의 괄호()안에 기술
    리턴값메소드 실행 후 호출한 곳으로 돌려주는 결과값
    • int result = add(10,20); // 30(리턴값)이 저장됨

객체와 클래스

클래스

  • 객체를 생성하는 설계도
  • 클래스 기반으로 여러개의 객체 생성 만들 수 있음
  • 구성 요소
    • 구성요소설명
      필드객체의 데이터를 저장 (변수,속성)
      생성자객체가 생성될 때 초기화를 담당 (리턴 타입 없음, 클래스명과 이름 동일)
      메소드객체가 수행할 동작을 정의 (함수)
  • 클래스 선언 규칙
    • 첫글자 대문자
    • CamelCase 표기
    • 숫자 o but 첫 문자에는 x
    • 특수문자 $,_ 가능
  • 종류
    • 라이브러리 클래스
      실행할 수 없으며 다른 클래스에서 이용하는 클래스
    • 실행 클래스
      main() 메소드르 가지고 있는 실행가능 클래스

인스턴스

  • 클래스로부터 생성된 객체 = 클래스의 인스턴스
  • 인스턴스화 : 클래스로부터 객체를 만드는 과정
  • 하나의 클래스는 여러 개의 인스턴스를 만들 수 있음

클래스 선언

필드 선언

필드

  • 객체의 데이터 저장
  • 고유 데이터, 상태 데이터, 부품 데이터

필드 선언

타입 필드명(=초기값);

  • 초기값 설정안하면 기본값으로 초기화

생성자 선언

  • new 연산자
    클래스 변수명 = new 클래스()
    • 객체를 생성후 생성자를 호출해서 객체 초기화
    • 객체를 생성해서 객체의 주소를 반환

기본 생성자

public 클래스명(){};

  • 생성자 선언이 없으면 컴퍼일러가 기본 생성자를 자동으로 추가
    • 선언된 생성자가 있으면 기본생성자 추가 X

생성자 선언

클래스명(매개변수,...){ //객체의 초기화 코드 }

  • 다양하게 초기화하기 위해 생성자를 직접 선언할 수 있음
  • 메소드와 비슷한 선언을 하지만 리턴 타입 X, 클래스명과 동일
  • 필드 초기화
    • this 키워드 이용해서 지역변수를 가져옴
      public class Car{
          //필드 선언
          String model;
          int price;
          int maxSpeed;
          //생성자 생성
          public Car(String model, int price, int maxSpeed){
              this.model = model;
              this.price = price;
              this.maxSpeed = maxSpeed;
          }
      }

생성자 오버로딩

  • 매개변수의 타입, 개수, 순서를 다르게 여러 개의 생성자 선언
Car(){}
Car(String model){}
Car(String model, int price){}
Car(String model, int price, int maxSpeed){}
  • new 연산자로 생성자 호출할때 제공된 매개 값의 타입, 수에 따라 실행될 생성자 결정

다른 생성자 호출

  • 생성자 오버로딩이 많아 질 경우 중복 코드 발생 가능
  • this() 를 이용해 공통 코드 호출
    Car(String model){
      this(model,5000,150);
    }
    Car(String model, int price){
      this(model,price,150);
    }
    Car(String model, int price, int maxSpeed){
      this.model = model;
      this.price = price;
      this.maxSpeed = maxSpeed;
    }

메소드 선언

리턴타입 메소드명 (매개변수,...){ //실행할 코드 }

  • 객체의 동작을 실행 블록으로 정의

메소드 호출

  • 클래스변수.메소드명(매개변수)로 호출

가변길이 매개변수

  • 매개변수의 개수와 상관없이 매개값을 줄 수 있음
int sum(int...values){
	// 합성값
	return result;
}
int result = sum(1,2,3);
int[] values = {1,2,3,4};
int result = sum(values);
int result = sum(new int[] {1,2,3,4,5,6};

메소드 오버로딩

  • 메소드 이름은 같지만 매개변수의 타입, 개수, 순서가 다른 메소드를 여러개 선언

인스턴스 멤버

  • 필드, 메소드 등 객체에 소속된 멤버
  • 객체를 생성해야만 사용할 수 있음
  • this 키워드 :
    • 객체 내부에서 인스턴스 멤버에 접근하기 위해 사용
    • 특히 생성자나 메소드의 매개변수명이 필드명과 동일할 경우 사용
    public class Car {
      String model;
      
      Car(String model) {
          this.model = model; // 필드(model)과 매개변수(model)를 구분
      }
    }

정적 멤버(static)

  • 클래스에 고정된 멤버 로, 객체 없이도 사용 가능
  • 메소드 영역(Method Area)의 클래스와 함께 로딩되어 프로그램 종료까지 메모리에 유지됨
  • static 키워드를 추가해 정적 필드와 정적 메소드 선언
  • 클래스 이름과 함께 . 연산자로 접근
    • 클래스이름.필드명, 클래스이름.메소드명(매개변수...)
  • 클래스 정의
    public class Calculator{
        static double pi = 3.141592;
    }
  • 클래스 사용
    public class Cal{
        public static void main(String[] args){
            double result1 = 10 * 10 * Calculator.pi;
        }
    }
  • 주의
    • 정적 멤버는 모든 객체가 공유하므로, 값을 변경하면 모든 객체에 영향을 미침
    • 인스턴스 멤버를 정적 메소드 내에서 직접 사용할 수 없음

final

final 타입 필드명 (=초기값);

  • 한 번 초기화되면 프로그램 실행 중 값이 변경될 수 없음

  • 반드시 초기화되어야 함!

  • 초기화 방법

    • 필드 선언 시에 초기값 대입
    • 생성자에서 초기값 대입
    public class Person {
        final String nation = "Korea"; // 선언 시 초기화
    
        final String ssn;
    
        Person(String ssn) {
            this.ssn = ssn; // 생성자에서 초기화
        }
    }
    

패키지(Package)

  • 클래스를 논리적으로 그룹화하는 기능
  • 클래스를 식별하는 용도
  • 패키지 선언
    • package 키워드를 사용하여 소스 파일의 최상단에 선언
    • 작성 규칙
      • 모두 소문자로 작성
      • 회사 도메인을 거꾸로 뒤집어서 패키지명을 짓는 것이 관례(com.google.search)

import 문

  • 다른 패키지에 있는 클래스를 사용하려면 import문을 사용해 해당 클래스를 불러와야함
  • 전체 클래스 이름(패키지명 + 클래스명) 지정
    • 클래스의 전체 이름 기술

접근 제한자

  • public, protected, privated
  • 중요한 필드와 메소드가 외부에 노출되지 않도록 객체의 무결성을 유지하기 위해 접근 제한자 사용
  • 접근 제한자제한 대상제한 범위
    public클래스, 필드, 생성자, 메소드없음
    protected필드, 생성자, 메소드같은 패키지이거나, 자식 객체만 사용 가능 (7장 상속에서 자세히 설명)
    (default)클래스, 필드, 생성자, 메소드같은 패키지
    접근 제어자를 생략했을때 -> 다른 패키지에서 사용 불가
    private필드, 생성자, 메소드객체 내부

Getter와 Setter

  • 객체의 필드(데이터) 은닉
private 타입 fieldName;
// Getter
public 타입 getFieldName() {
    return fieldName;
}
// Setter
public void setFieldName(타입 fieldName) {
    this.fieldName = fieldName;
}
  • 해당 코드와 같이 사용하면 외부에서는 필드값 차제를 접근하기보다는 getter와 setter을 이용해서 접근함
  • IDE에서 자동 생성 기능을 제공 Alt + Insert

Getter 메서드

  • 필드값이 객체 외부에서 사용하기에 부적절한 경우 적절한 값으로 변환하여 리턴
  • boolean타입은 메서드 이름을 isXxxx()로 지정하는 것이 관례

Setter

  • 데이터를 검증해서 유효한 값만 필드에 저장

싱글톤 Singleton 패턴

  • 프로그램 전체에서 객체를 하나만 만들어서 여러 곳에서 사용하는 것
  • 싱글톤 패턴 구조
    1. 생성자를 private으로
      → 다른 곳에서 new로 객체를 만들 수 없게 막음
    2. 자기 자신을 참조하는 private static 객체를 클래스 안에 만듦
      → 프로그램이 시작할 때 딱 한 번 만들어짐
    3. 객체를 얻는 public static 메소드를 제공
      → 객체를 직접 만들지 않고 이 메소드를 통해서만 가져가게 함.
public class Singleton {
    // 1. 자기 자신 타입의 static 필드를 선언하고 객체를 생성
    private static Singleton instance = new Singleton();

    // 2. 생성자를 private으로 선언 (외부에서 new 사용 금지)
    private Singleton() {}

    // 3. public 메소드로 인스턴스를 제공
    public static Singleton getInstance() {
        return instance;
    }
}
  • 사용 방법
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();

System.out.println(obj1 == obj2); // true (같은 객체)

0개의 댓글