본문 바로가기
Programming/Java

클래스와 생성자

by Tarake 2024. 8. 2.

클래스(Class)


public class Car {
    // 필드(속성), 인스턴스 변수
    private String model;
    private int year;
    private String color;

    // 생성자
    public Car(String model, int year, String color) {
        this.model = model;
        this.year = year;
        this.color = color;
    }

    // 메소드(행동), 인스턴스 메소드
    public void start() {
        System.out.println("Car is starting.");
    }

    public void stop() {
        System.out.println("Car is stopping.");
    }

    public void displayDetails() {
        System.out.println("Model: " + model + ", Year: " + year + ", Color: " + color);
    }

    // Getter 메소드
    public String getModel() {
        return model;
    }

    // Setter 메소드
    public void setModel(String model) {
        this.model = model;
    }
}

자바에서 클래스란 객체 지향 프로그래밍(OOP)의 핵심 개념으로 객체를 생성하기 위한 설계도 역할을 합니다.

래스는 객체의 상태를 정의하는 속성(필드)과 객체의 행동을 정의하는 메소드로 구성됩니다.

클래스는 코드의 재사용성과 확장성을 높이며, 객체의 캡슐화(encapsulation)를 통해 데이터 보호와 코드의 유지보수성을 향상시킵니다.

 

클래스의 기본 구성 요소


  • 필드(Fields) : 객체의 상태나 속성을 나타내는 변수입니다.
  • 메소드(Methods) : 객체의 행동이나 기능을 정의하는 함수입니다.
  • 생성자(Constructors) : 객체가 생성될 때 호출되어 초기화 작업을 수행하는 특수 메소드입니다.

 

클래스의 주요 특징


  1. 캡슐화(Encapsulation)
    1. 클래스는 데이터(필드)와 메소드를 하나의 단위로 묶어 외부에서 접근을 제어합니다.
    2.  접근 제어자는 데이터의 접근 수준을 지정하는 데 사용됩니다. (public, private, protected, default)
  2. 상속(Inheritance)
    1.  클래스는 다른 클래스의 특성과 행동을 상속받아 재사용할 수 있습니다.
    2.  상속을 통해 코드의 재사용성을 높이고, 기능 확장을 용이하게 합니다.
  3. 다형성(Polymorphism)
    1.  같은 이름의 메소드가 다양한 형태로 동작할 수 있는 능력입니다.
    2.  다형성은 메소드 오버로딩과 메드 오버라이딩을 통해 구현됩니다.
  4. 추상화(Abstraction)
    1.  클래스는 객체의 복잡한 내부 구현을 감추고, 필요한 인터페이스만 제공하여 사용이 편리하도록 합니다.
    2.  추상 클래스나 인터페이스를 통해 구현됩니다.

 

클래스와 객체의 관계


  •  클래스 : 설계도 또는 타입을 정의하는 개념.
  •  객체 : 클래스를 기반으로 생성된 인스턴스, 메모리에 실제로 존재하는 데이터.

클래스는 객체의 특성과 행동을 정의하며, 객체는 클래스의 실체로서 프로그램 내에서 실제로 사용됩니다. 객체를 통해 클래스에서 정의한 메소드와 필드를 사용할 수 있습니다.

 

클래스 인스턴스


// 클래스 정의
public class Car {
    // 인스턴스 변수
    private String brand;
    private int year;

    // 생성자
    public Car(String brand, int year) {
        this.brand = brand;
        this.year = year;
    }
}
public class Main {
    public static void main(String[] args) {
        // Car 클래스의 인스턴스 생성
        Car car1 = new Car("Toyota", 2020);
    }
}

클래스 인스턴스는 클래스의 청사진을 기반으로 생성된 구체적인 객체입니다. 객체 지향 프로그래밍에서 클래스는 속성과 행동을 정의하는 템플릿 역할을 하며, 인스턴스는 이 템플릿을 바탕으로 메모리에 할당된 실제 데이터와 기능을 포함한 개체입니다.

 

클래스와 인스턴스의 관계


  • 여러 인스턴스는 하나의 클래스에서 파생될 수 있으며, 각 인스턴스는 클래스가 정의한 속성 값을 가집니다.
  • 인스턴스는 클래스의 메드를 호출할 수 있으며, 이러한 호출은 인스턴스의 상태에 영향을 미칠 수 있습니다.

 

클래스 변수


public class MyClass {
    // 클래스 변수 선언
    static int classVariable = 0;

    // 인스턴스 변수
    int instanceVariable = 0;

    // 클래스 메소드
    static void incrementClassVariable() {
        classVariable++;
    }

    // 인스턴스 메소드
    void incrementInstanceVariable() {
        instanceVariable++;
    }
}

클래스 변수(또는 정적 변수, Static Variable)는 객체 지향 프로그래밍에서 클래스 자체에 속하는 변수로, 모든 인스턴스가 공유하는 변수를 말합니다. Java에서는 static 키워드를 사용하여 클래스 변수를 선언할 수 있습니다. 클래스 변수는 메모리의 메소드 영역에 저장되며, 프로그램이 시작될 때 메모리에 로드되어 프로그램이 종료될 때까지 존재합니다.

 

클래스 변수의 특징


  • 공유: 클래스에 의해 생성된 모든 객체가 동일한 변수 값을 공유합니다
  • 클래스 수준: 클래스의 인스턴스가 없어도 클래스 변수에 접근할 수 있습니다.
  • 메모리 절약: 각 인스턴스가 변수의 별도 복사본을 가지지 않으므로 메모리를 절약할 수 있습니다.
  • 정적 초기화: 클래스가 처음 로드될 때 정적 초기화 블록에서 초기화할 수 있습니다.

 

클래스 변수의 장점


  • 데이터 공유: 클래스 변수는 모든 인스턴스가 데이터를 공유할 수 있으므로, 동일한 데이터가 여러 복사본으로 존재할 필요가 없습니다.
  • 메모리 절약: 각 객체에 동일한 데이터를 복사하지 않으므로 메모리를 절약할 수 있습니다.
  • 글로벌 상태 유지: 프로그램의 전체 상태나 환경 설정과 같은 전역 정보를 유지하는 데 유용합니다.

 

클래스 변수의 주의 사항


  • 동기화 필요성: 멀티스레드 환경에서는 클래스 변수가 여러 스레드에 의해 동시에 변경될 수 있으므로, 동기화가 필요할 수 있습니다.
  • 상태 오염 위험: 전역적으로 접근 가능한 클래스 변수는 프로그램의 의도치 않은 곳에서 변경될 수 있어, 상태 오염의 위험이 있습니다.
  • 설계 고려: 클래스 변수를 사용하면 클래스 간 결합도가 높아질 수 있으므로, 필요할 때만 사용하고 신중하게 설계해야 합니다.

 

클래스 변수와 인스턴스 변수의 차이


  • 클래스 변수는 클래스 자체에 속하며, 모든 인스턴스가 공유합니다. static 키워드를 사용하여 선언하며, 인스턴스 없이도 클래스 이름으로 접근할 수 있습니다.
  • 인스턴스 변수는 각각의 인스턴스에 속하며, 각 인스턴스가 고유한 값을 가집니다. 인스턴스가 생성될 때마다 메모리에 할당되며, 인스턴스가 소멸될 때 해제됩니다.

 

클래스 메소드


public class MathUtility {
    // 클래스 변수
    private static int calculationCount = 0;

    // 클래스 메소드: 두 수의 합을 계산
    public static int add(int a, int b) {
        calculationCount++;
        return a + b;
    }
}

클래스 메소드(Class Method)는 클래스에 속하는 메소드로, 인스턴스에 속하지 않고 클래스 자체에 관련된 작업을 수행하는 데 사용됩니다. Java에서는 static 키워드를 사용하여 클래스 메소드를 정의합니다. 클래스 메소드는 클래스의 인스턴스를 생성하지 않고도 호출할 수 있으며, 주로 클래스 변수(정적 변수)와 함께 사용됩니다.

 

클래스 메소드의 특징


  • 정적 메소드: 클래스 메소드는 static으로 선언되며, 클래스의 인스턴스와 독립적으로 존재합니다.
  • 클래스 변수 사용: 클래스 메소드는 클래스 변수(정적 변수)와 상호작용할 수 있습니다.
  • 인스턴스 변수 접근 불가: 클래스 메소드는 인스턴스 변수에 접근할 수 없습니다. 인스턴스 변수가 필요할 경우, 메소드에 인스턴스를 매개변수로 전달해야 합니다.
  • 클래스 이름으로 호출: 클래스 메드는 클래스 이름을 통해 호출됩니다.

 

클래스 메소드의 장점


  • 인스턴스화 불필요: 인스턴스를 생성하지 않고도 메소드를 호출할 수 있어 편리합니다.
  • 유틸리티 기능 구현: 클래스 메소드는 일반적으로 유틸리티 함수나 헬퍼 함수로 구현되어, 특정 작업을 수행하는 데 유용합니다.
  • 효율성: 클래스 메소드는 프로그램의 상태와 독립적으로 동작하므로, 특정 작업을 빠르게 수행할 수 있습니다.

 

클래스 메소드의 주의 사항


  • 인스턴스 변수 접근 불가: 클래스 메소드는 인스턴스 변수에 접근할 수 없습니다. 인스턴스 변수나 메소드를 사용하려면, 인스턴스를 매개변수로 받아서 작업해야 합니다.
  • 오버라이딩 불가: 클래스 메소드는 상속받은 클래스에서 오버라이드할 수 없습니다. 이는 클래스 메소드가 정적 바인딩을 사용하기 때문입니다.

 

생성자(Constructor)


public class Car {
    private String model;
    private int year;

    // 기본 생성자
    public Car() {
        this.model = "Unknown";
        this.year = 0;
    }

    // 매개변수가 있는 생성자
    public Car(String model, int year) {
        this.model = model;
        this.year = year;
    }

    // 생성자 오버로딩
    public Car(String model) {
        this.model = model;
        this.year = 2020; // 기본 연도로 초기화
    }
}

생성자(Constructor)는 클래스의 객체가 생성될 때 호출되어 객체의 초기화 작업을 수행하는 특수한 메소드입니다. 생성자는 클래스와 이름이 같고, 반환 타입이 없으며, 객체의 필드를 초기화하거나 필요한 초기 설정을 수행할 수 있습니다.

 

생성자의 특징


  1. 클래스와 같은 이름
    1.   생성자는 클래스와 동일한 이름을 가집니다.
    2.   생성자는 void와 같은 반환 타입을 사용하지 않습니다.
    3.   생성자는 반환값이 없습니다.
  2. 자동 호출
    1.  객체가 생성될 때 자동으로 호출됩니다.
    2.  new 키워드를 사용하여 객체를 생성할 때 호출됩니다.
  3. 오버로딩 가능
    1.  클래스 내에 여러 개의 생성자를 정의할 수 있으며, 각 생성자는 서로 다른 매개변수 목록을 가질 수 있습니다. 이를 생성자 오버로딩(Constructor Overloading)이라고 합니다.
  4. 기본 생성자
    1.  클래스에 생성자가 명시적으로 정의되지 않으면, 컴파일러가 기본 생성자(default constructor)를 자동으로 추가합니다.
    2.  기본 생성자는 매개변수가 없는 생성자로, 아무 작업도 수행하지 않거나 객체를 기본값으로 초기화합니다.

 

생성자의 역할


  •  객체 초기화: 생성자는 객체의 필드를 초기화하고 필요한 초기 설정을 수행합니다.
  •  필수 초기화 보장: 객체가 올바른 상태로 생성되도록 필수적인 초기화를 강제할 수 있습니다.

 

생성자 체이닝 (Constructor Chaining)


public class Person {
    private String name;
    private int age;

    // 기본 생성자
    public Person() {
        this("Unknown", 0); // 다른 생성자 호출
    }

    // 매개변수가 있는 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

생성자 체이닝은 하나의 생성자가 다른 생성자를 호출하여 코드 중복을 줄이고 초기화 로직을 공유하는 기법입니다. this 키워드를 사용하여 같은 클래스 내의 다른 생성자를 호출할 수 있습니다.

 

주의사항

  •  생성자는 오직 객체의 초기화 작업만 수행하도록 설계해야 하며, 복잡한 로직이나 외부 의존성을 처리하는 것은 피하는 것이 좋습니다.
  •  모든 클래스에는 적절한 생성자가 있어야 하며, 특히 무인자 생성자(no-arg constructor)가 필요한 경우 명시적으로 정의해야 합니다.
  •  상속에서의 생성자 호출 시 부모 클래스의 생성자를 명시적으로 호출해야 할 수 있으며, 그렇지 않으면 기본 생성자가 자동 호출됩니다.

 


출처

W3school

 

W3Schools.com

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

'Programming > Java' 카테고리의 다른 글

메소드 오버로딩(Method overloading)  (0) 2024.08.03
정보 은닉과 캡슐화  (1) 2024.08.02
Java 메소드와 변수의 스코프  (0) 2024.08.01
실행 흐름의 컨트롤  (0) 2024.08.01
연산자(Operators)  (0) 2024.08.01