지식보부상님의 공부 일지

Java [06] 클래스 본문

KB IT's Your Life/Java

Java [06] 클래스

지식보부상님 2025. 4. 22. 17:29

[1] 객체지향 프로그래밍 

◈ 객체, 필드, 메서드

- 객체(object) : 물리적으로 존재하거나 개념적인 것 중 다른 것과 식별 가능한 것

- 필드(field) : 객체 내 속성, 객체의 데이터

- 메서드(method) : 객체 내 동작

 

◈ 객체 간의 관계

- 집합 관계: 완성품과 부품의 관계

사용 관계: 다른 객체의 필드 읽고 변경하거나 메소드 호출하는 관계

- 상속 관계: 부모와 자식 관계, 부모의 특징을 자식에게 물려줌

집합, 사용, 상속 관계

◈ 객체 지향 프로그래밍 특징

- 캡슐화(Encapsulation): 객체의 데이터(필드), 동작(메서드)를 하나로 묶어서 실제 구현 내용은 외부에 감춤

  - 접근 제한자(Access Modifier) 이용 => 캡슐화된 멤버 노출 여부 결정

상속: 부모(상위) 객체의 필드와 메소드를 자식(하위) 객체가 사용할 수 있도록 함

  - 코드의 재사용성 ↑, 유지보수 기간 ↓

- 다형성(Polymorphism): 사용 방법은 동일하나 다양한 실행 결과가 나오는 것


[2] 객체와 클래스 

◈ 클래스와 인스턴스

- 클래스: 객체를 생성하기 위한 설계도

- 인스턴스: 클래스로부터 생성된 객체 


[3] 클래스 선언 

◈ 클래스 선언

- 소스 파일명과 동일하게 작성

- 첫문자 대문자의 캐멀스타일, 숫자 가능 but 첫문자는 숫자x, $, _ 사용 가능


[4] 객체 생성과 클래스 변수 

◈ 객체 생성

클래스 변수 = new 클래스();

◈ 클래스 용도

- 라이브러리(library) 클래스 : 실행 불가, 다른 클래스에서 이용하는 용도

- 실행 클래스: main() 메소드 가지는 실행 가능한 클래스


[5] 클래스의 구성 멤버 

◈ 클래스 구성 멤버

- 필드(Field) : 객체 데이터 저장, 선언 형태는 변수 선언과 비슷

- 성성자(Constructor) : 객체 생성시 초기화 담당, 리턴 타입 없음, 이름은 클래스 이름과 동일

- 메소드(Method) : 객체가 수행할 동작, 객체간의 상호작용 위해 호출됨


[6] 필드 선언과 사용 

◈ 필드 선언

타입 필드명 [= 초기값];

- 반드시 클래스 블록 내에서 선언되어야

- 선언시 초기값 설정 해도/하지 않아도 됨, 설정 안하면 기본값으로 초기화됨

 

◈ 필드 사용

- 객체 내부에서는 필드명으로 값 변경(접근 가능)

- 객체 외부에서는 도트(.) 연산자 이용하여 접근


[7] 생성자 선언과 호출 

◈ new 연산자

- 객체 생성 후 바로 생성자(constructor) 호출하여 객체 초기화 

클래스 변수 = new 클래스();

- 생성자 호출 끝나면 객체 주소를 반환 => 클래스 변수에 대입

 

◈ 기본 생성자

- 기본 생성자: 클래스에 생성자 없으면 컴파일러가 바이트코드 파일에 자동으로 추가하는 생성자

 

◈ 생성자 선언

- 객체 초기화 위해 선언

- 한개 이상 생성자 선언 가능

- 리턴 타입 없고 클래스 이름과 동일하게 선언 (메소드와 비슷한 형태)

- [alt] + [ins] 단축키로 빠른 선언 가능

 

◈ 생성자에서의 변수명

- this 키워드: 현재 인스턴스에 대한 참조 변수, this.변수명으로 필드 변수에 접근

public class Korean {
    // 필드 선언
    String nation = "대한민국";
    String name;
    String phoneNum; 
    
    // 생성자 선언
    public Korean(String name, String phoneNum) {
        this.name = name;
        this.phoneNum = phoneNum;
    }
}

 

◈ 생성자 오버로딩

- 생성자 오버로딩: 매객변수가 다른 생성자를 여러개 선언하는 것

더보기
public class Car {
    // 필드 선언
    String company;
    String model;
    String color;
    int maxSpeed;
    
    // 생성자 선언 (오버로딩)
    Car() {}
    
    Car(String model){
        this.model = model;
    }
    
    Car(String model, String color){
        this.model = model;
        this.color = color;
    }
    
    Car(String model, String color, int maxSpeed){
        this.model = model;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
}

◈ 다른 생성자 호출

- this(el1, el2, ...) : 생성자 오버로딩 많은 경우의 중복 코드를 줄이는 방법

더보기
public class CarModified {
    // 필드 선언
    String company;
    String model;
    String color;
    int maxSpeed;

    // 생성자 선언 (오버로딩)
    CarModified() {}

    CarModified(String model){
        this(model, "black", 200);
    }

    CarModified(String model, String color){
        this(model, color, 200);
    }

    CarModified(String model, String color, int maxSpeed){
        this.model = model;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
}

[8] 메소드 선언과 호출 

◈ 메소드 선언

- 리턴타입 메소드명 ( 매개변수, ... ) {  실행 코드 } 로 선언

- 리턴타입: 리턴값 없으면 void, 있다면 리턴하는 값의 자료형

메소드명: 첫 문자 소문자로 시작, 캐멀 스타일

 

◈ 메소드 호출

- 객체 내부에서는 메소드 이름으로 호출

- 객체 외부에서는 도트(.) 연산자로 호출

 

◈ 가변길이 매개변수

- 매개값들이 자동으로 배열 항목으로 변환되어 메소드에서 사용됨

int sum(int ... values){ } // 메소드 정의
더보기

Calculator.java 

public class Calculator {
    int sum (int ... values) {
        int sum = 0;
        for (int value : values) {
            sum += value;
        }
        return sum;
    }
}

 

CalculatorMain.java

public class CalculatorMain {
    public static void main(String[] args) {
        Calculator calc = new Calculator();

        System.out.println(calc.sum(1, 2, 3)); // 6
        System.out.println(calc.sum(1, 2, 3, 4, 5)); // 15

        System.out.println(calc.sum(new int[] {1, 2, 3, 4, 5})); // 15
    }
}

 

◈ 메소드 오버로딩(Overloading)

- 메소드 이름은 같지만 매개변수 타입, 개수, 순서 등이 다른 메소드 여러개 선언하는 것

- 다양한 매개값을 처리하기 위함

public class AreaCalculator {
    // 정사각형 넓이
    double areaRectangle(double width){
        return width * width;
    }
    // 직사각형 넓이
    double areaRectangle(double width, double height){
        return width * height;
    }
}

[9] 인스턴스 멤버

◈ 선언 방법에 따른 멤버 구분

- 인스턴스(Instance) 멤버

  - 객체에 소속된 멤버로 객체 생성해야만 사용 가능

  - 객체 내부에서 접근하려먼 this 로 접근

- 정적(Static) 멤버: 클래스에 고정된 멤버, 객체 없이도 사용 가능


[10] 정적 멤버 

◈ 정적 멤버

- 메소드 영역의 클래스에 고정적으로 위치하는 멤버 

- 객체 생성 필요 없이 클래스이름. (도트) 로 접근

- static 키워드를 추가하여 선언하면 됨

- 클래스가 메모리로 로딩될 때 자동으로 실행되므로 생성자에서 초기화 x

더보기

Calculator.java

public class Calculator {
    static double pi = 3.14;

    static double circumference (int radius) {
        return 2 * pi * radius;
    }

    static double area (int radius) {
        return pi * radius * radius;
    }
}

 

CalculatorMain.java

public class CalculatorMain {
    public static void main(String[] args) {
        System.out.println("pi : " + Calculator.pi);
        System.out.println("circumference : " + Calculator.circumference(10));
        System.out.println("area : " + Calculator.area(10));
    }
}

^ 위와 같이 객체 생성 없이 출력 가능하다

◈ 인스턴스 멤버 사용 불가

- 정적 블록, 메소드 내부에서 인스턴스 필드, 메소드, this 사용 불가

=> 사용하고 싶다면 객체 생성하여 참조 변수로 사용 

더보기
static void Method() {
     // 객체 생성
    ClassName obj = new ClassName();
    
    // 인스턴스 멤버 사용
    obj.field1 = 10;
    obj.method();
}

[11] final 필드와 상수 

◈ final 필드

- 초기값 저장되면 프로그램 실행 도중 수정 불가

final 타입 필드 [=초기값];

- 필드 선언시 초기값 대입 또는 생성자에서 대입

 

◈ 상수 (Constant)

- 불변의 값 => final 이면서 static 인 성격

static final 타입 상수 [=초기값];

- 관례적으로 대문자로 스네이크 표기법 이용

- static 이므로 클래스명.상수명 으로 접근하면 됨


[13] 접근 제한자 

◈ 접근 제한자

- 중요한 필드, 메소드 외부도 노출되지 않도록 함

접근 제한자 제한 대상 제한 범위
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자, 메소드 같은 패키지 또는 자식 객체만
(default) 클래스, 필드, 생성자, 메소드 같은 패키지
private 필드, 생성자, 메소드 객체 내부

 

◈ 클래스의 접근 제한

- public 또는 default 접근 제한 가질 수 있음 (생략시 default)

 

◈ 생성자의 접근 제한

- public, default, private 접근 제한 가질 수 있음

 

◈ 필드, 메소드의 접근 제한

- public, default, private 접근 제한 가질 수 있음


[14] Getter와 Setter

◈ Setter

- 외부에서의 직접적인 필드 접근을 막아 객체의 무결성 유지되도록 함

- 메소드 통해 데이터 검증해서 유효한 값만 필드에 저장할 수 있도록 함

- 일반적으로 set + 필드이름(첫글자 대문자)로 메소드명 지정

더보기
private double speed;
// Setter 메서드
public void setSpeed(double speed) {
    if(speed < 0){
    	this.speed = 0;
        return;
    } else {
    	this.speed = speed;
    }
}

^ Setter 메서드인 setSpeed 를 정의하여 음수의 speed는 저장되지 않도록 제어함

◈ Getter 

- 객체 외부에서 적절한 값으로 사용할 수 있도록 객체 내부의 필드를 리턴해주는 메소드

- 일반적으로 get + 필드이름(첫글자 대문자) 로 메소드명 지정

- 리턴 타입이 boolean 이면 is + 필드이름(첫글자 대문자) 로 지정

더보기
private double speed;
// Getter
public double getSpeed() {
    double km = speed * 16;
    return km;
}

 ^ private 필드인 speed를 km 단위로 변환하여 객체 외부로 리턴


 

'KB IT's Your Life > Java' 카테고리의 다른 글

Java [08] 인터페이스  (0) 2025.04.23
Java [07] 상속  (1) 2025.04.22
Java [05] 참조 타입  (3) 2025.04.22
Java [04] 조건문과 반복문  (1) 2025.04.21
Java [03] 연산자  (0) 2025.04.21