클래스

이기영·2024년 6월 2일

Java 기초학습

목록 보기
5/14
post-thumbnail

목표

자바의 Class에 대해 학습

목차

1. 클래스 정의하는 방법
2. 객체 만드는 방법 (new 키워드 이해하기)
3. 메소드 정의하는 방법
4. 생성자 정의하는 방법
5. this 키워드 이해하기


1. 클래스 정의하는 방법

자바에서 클래스는 객체를 생성하기 위한 청사진(blueprint) 역할을 하며, 속성(필드)동작(메소드)를 정의하여 사용합니다.

1-1 클래스의 정의

  클래스는 class 키워드를 사용하여 정의합니다. 기본적인 구조는 아래와 같습니다.


public class ClassName {
    // 필드 (속성)
    // 생성자
    // 메소드 (동작)
}
  • 여기서 public접근 제어자 입니다. 이 위치에 클래스에 접근할 수 있는 범위를 지정할 수 있습니다.

  • className은 클래스의 이름입니다. 클래스 이름은 대문자로 시작하는것이 관례라고 합니다.


1-2 필드(속성) 정의

필드는 클래스의 상태를 저장하는 변수입니다.

예시)

public class Car {
    // 필드
    private String color;
    private String model;
    private int year;
}

  car 라는 클래스에 색상, 모델, 만들어진 연도 등의 정보를 담을 수 있겠습니다. 위 클래스를 통해 만들어지는 car들은 각각 다른 정보드를 가지고 있을 수 있습니다. 그렇기 때문에 청사진(blueprint, 여러번 찍어낼 수 있는..)와 비슷하다고 이해하면 알기 쉽습니다.

※ 여기서 private는 접근 제어자 중 하나로, 해당 필드가 클래스 내부에서만 접근 가능하도록 합니다.


1-3 생성자 정의

생성자는 클래스의 인스턴스가 생성될 때 호출 되며, 주로 필드를 초기화하는 데 사용됩니다. 생성자의 이름은 클래스의 이름과 같아야 하며, 반환타입이 없습니다.


1-4 메소드 (동작) 정의

메소드는 클래스의 동작을 정의합니다. 메소드는 특정 작업을 수행하는 코드 블럭입니다.

예시)

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

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

    // 메소드
    public void startEngine() {
        System.out.println("Engine started");
    }

    public void stopEngine() {
        System.out.println("Engine stopped");
    }

    public String getColor() {
        return this.color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getModel() {
        return this.model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public int getYear() {
        return this.year;
    }

    public void setYear(int year) {
        this.year = year;
    }
}

설명

  1. public 메소드는 클래스 외부에서도 접근할 수 있습니다.
  2. void는 반환 타입으로, 해당 메소드는 값을 반환하지 않음을 의미합니다.
  3. 메소드 이름은 소문자로 시작하며, 동사형을 사용하는 것이 관례입니다.
  4. getColorsetColor메소드는 필드에 접근하고 수정하는 데 사용되는 getter와 setter 메소드입니다. 이를 통해 private 로 지정된 필드에 접근할 수 있습니다.



2. 객체 만드는 방법

객체는 위에서 설명한 class를 기반으로 생성이 되며, 객체는 클래스의 인스턴스라고도 불리웁니다. 객체는 클래스로 부터 생성된 실제 존재하는 개체를 의미한다고 볼 수 있겠습니다.

2-1 객체 생성

  객체를 생성하려면 new 키워드를 사용하여 클래스의 생성자를 호출합니다. 기본적인 형시은 아래와 같습니다.

ClassName objectName = new ClassName(parameters);
  • className은 객체를 생성할 클래스의 이름입니다.
  • objectName은 생성된 객체를 참조할 변수의 이름입니다.
  • new 키워드는 객체를 힙 메모리에 생성합니다.
  • ClassName(parameters)는 클래스의 생성자를 호출합니다. parameters는 생성자가 필요로 하는 인자입니다.

  기껏 위에서 Car클래스를 만들어 두었으니, 이를 사용해 예시를 보여드리겠습니다.

public class Main {
    public static void main(String[] args) {
        // Car 객체 생성
        Car myCar = new Car("Red", "KIA", 2020);
        
        // 객체의 메소드 호출
        myCar.startEngine(); 
        // 출력: Engine started
        System.out.println("Car color: " + myCar.getColor()); // 출력: Car color: Red
        
        // 객체의 필드 변경
        myCar.setColor("Blue");
        System.out.println("Updated car color: " + myCar.getColor()); 
        // 출력: Updated car color: Blue
        
        // 다른 Car 객체 생성
        Car anotherCar = new Car("Black", "HD", 2018);
        System.out.println("Another car model: " + anotherCar.getModel()); 
        // 출력: Another car model: Honda
    }
}

2-2 객체 생성과 관련된 주요 개념

  • 생성자 : 생성자는 객체가 생성될 때 호출되는 특별한 메소드입니다. 객체의 필드를 초기화하는 역할을 합니다.

  • 필드 접근 및 수정 : 객체의 필드를 직접 접근하거나 수정할 때는 보통 gettersetter 메소드를 사용합니다. 이는 필드의 직접 접근을 막고 캡슐화를 유지하기 위해서입니다.

  • 메소드 호출 : 객체가 생성되면 객체의 메소드를 호출하여 다양한 동작을 수행할 수 있습니다.


2-3 여러 객체 생성

public class Main {
    public static void main(String[] args) {
        Car car1 = new Car("Red", "Toyota", 2020);
        Car car2 = new Car("Blue", "Honda", 2019);
        
        // 각 객체의 필드와 메소드에 독립적으로 접근 가능
        System.out.println("Car 1 color: " + car1.getColor()); // 출력: Car 1 color: Red
        System.out.println("Car 2 color: " + car2.getColor()); // 출력: Car 2 color: Blue

        car1.startEngine(); // 출력: Engine started
        car2.stopEngine();  // 출력: Engine stopped
    }
}

  이처럼 클래스는 객체를 생성하기 위한 템플릿을 제공하며, 각 객체는 독립적인 필드와 메소드를 가집니다. 객체는 클래스의 인스턴스로, new 키워드를 통해 생성되고 생성자를 통해 초기화 됩니다.



3. 메소드 정의하는 방법

자바에서 메소드는 특정 작업을 수행하기 위해 클래스 내에 정의된 코드 블록입니다. 메소드는 재사용 가능한 코드를 만들고, 객체의 행동을 정의하는 데 사용됩니다. 메소드 정의는 크게 두 가지 부분으로 나뉩니다. 여기서는 메소드 선언과 메소드 분문 이 두 부분을 보겠습니다.

3-1 메소드 선언

  메소드 선언은 메소드의 이름, 반환 타입, 매개변수 목록을 정의합니다. 기본적인 구조는 아래와 같습니다.

accessModifier returnType methodName(parameterList) {
    // 메소드 본문
}
  • accessModifier : 메소드의 접근 제어자를 지정합니다. (예: public, private, protected, default)

  • returnType : 메소드가 반환하는 값의 타입을 지정합니다. 반환값이 없는 경우, void를 사용합니다.

  • methodName : 메소드가 받을 매개변수 목록을 정의합니다. 매개변수가 없으면 빈 괄호 ()를 사용하면됩니다.


메소드 본문은 {}로 감싸며, 이 안에 실행할 코드를 작성합니다.

예제

public class MathUtils {

    // 두 숫자의 합을 반환하는 메소드
    public int add(int a, int b) {
        return a + b;
    }

    // 두 숫자의 차를 반환하는 메소드
    public int subtract(int a, int b) {
        return a - b;
    }

    // 인삿말을 출력하는 메소드
    public void printGreeting(String name) {
        System.out.println("Hello, " + name + "!");
    }
}
  • add : 두 정수를 입력받아, 합을 반환합니다. 여기서 알 수 있듯이, 반환 타입은 int 타입입니다.

  • subtract : 두 정수를 입력받아 차를 반환합니다. 마찬가지로 int 타입을 반환합니다.

  • printGreeting : 문자열을 입력받아 인사말을 출력합니다. 출력하고 끝이므로, 반환값이 없어 void입니다.


3-2 메소드 호출

  정의된 메소드는 클래스의 객체를 통해 호출할 수 있습니다.

public class Main {
    public static void main(String[] args) {
        // MathUtils 객체 생성
        MathUtils mathUtils = new MathUtils();
        
        // add 메소드 호출
        int sum = mathUtils.add(5, 3);
        System.out.println("Sum: " + sum); 
        // 출력: Sum: 8
        
        // subtract 메소드 호출
        int difference = mathUtils.subtract(10, 4);
        System.out.println("Difference: " + difference); 
        // 출력: Difference: 6
        
        // printGreeting 메소드 호출
        mathUtils.printGreeting("Alice"); 
        // 출력: Hello, Alice!
    }
}

3-3 메소드 오버로딩

메소드 오버로딩은 동일한 이름의 메소드를 여러 개 정의하되, 매개변수 목록이 다르도록 하는 것입니다.

public class MathUtils {

    // 두 정수를 더하는 메소드
    public int add(int a, int b) {
        return a + b;
    }

    // 세 정수를 더하는 메소드 (오버로딩)
    public int add(int a, int b, int c) {
        return a + b + c;
    }

    // 두 실수를 더하는 메소드 (오버로딩)
    public double add(double a, double b) {
        return a + b;
    }
}

예제

public class Main {
    public static void main(String[] args) {
        MathUtils mathUtils = new MathUtils();
        
        int sum1 = mathUtils.add(1, 2);
        int sum2 = mathUtils.add(1, 2, 3);
        double sum3 = mathUtils.add(1.5, 2.5);
        
        System.out.println("Sum1: " + sum1); 
        // 출력: Sum1: 3
        System.out.println("Sum2: " + sum2); 
        // 출력: Sum2: 6
        System.out.println("Sum3: " + sum3); 
        // 출력: Sum3: 4.0
    }
}

3-4 기타 중요 개념

  • 반환 타입 : 메소드는 작업을 수행한 결과를 호출자에게 반환할 수 있습니다. 반환 타입이 void가 아닌 경우 return 키워드를 사용하여 값을 반환합니다.

  • 매개변수 : 메소드는 호출 시 전달받은 값을 매개변수를 통해 사용할 수 있습니다. 매개변수는 타입과 이름을 지정하여 선언합니다.

  • 접근 제어자 : 메소드의 접근 수준을 정의합니다. public, private, protected, default 등이 있습니다.

  • 스코프 : 메소드 내에서 선언된 변수는 해당 메소드 내에서만 유효합니다. 이를 지역 변수라고 합니다.

스코프 관련해서 call of value vs call of reference 를 한번 찾아 보시면 좋을것 같습니다.

  이처럼 자바에서 메소드는 클래스의 동작을 정의하며, 메소드 선언과 본문을 통해 다양한 작업을 수행할 수 있습니다. 메소드는 객체의 행동을 정의하고, 재사용 가능한 코드를 작성하는 데 중요한 역할을 합니다.



4. 생성자 정의하는 방법

  자바에서 생성자는 클래스의 인스턴스를 초기화하는 특별한 메소드입니다.

  생성자의 이름은 클래스의 이름과 같아야 하며, 반환 타입이 없습니다. 생성자는 객체가 생성될 때 호출되며, 객체의 필드를 초기화하거나 초기 설정 작업을 수행하는데 사용됩니다.

4-1 기본 생성자

  기본 생성자는 매개변수를 가지지 않는 생성자입니다. 클래스에 명시적으로 생성자를 정의하지 않으면 컴파일러가 자동으로 기본 생성자를 제공합니다.

  하지만 생성자가 하나라도 명시적으로 정의되어 있으면 기본 생성자는 자동으로 제공되지 않습니다.

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

    // 기본 생성자
    public Car() {
        // 필드 초기화 (기본값)
        this.color = "Unknown";
        this.model = "Unknown";
        this.year = 0;
    }
}

4-2 매개변수가 있는 생성자

  매개변수가 있는 생성자는 객체를 생성할 때 필요한 값을 전달받아 필드를 초기화 합니다.

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

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

4-3 여러 생성자(생성자 오버로딩)

  클래스는 여러 개의 생성자를 가질 수 있으며, 이를 생성자 오버로딩이라고 합니다. 각 생성자는 다른 매개변수 목록을 가질 수 있습니다.

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

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

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

    // 일부 필드만 초기화하는 생성자
    public Car(String color, String model) {
        this.color = color;
        this.model = model;
        this.year = 0;
    }
}

4-4 생성자 호출

  생성자는 new 키워드를 사용하여 객체를 생성할 때 호출됩니다. 예신느 아래와 같습니다.

예시

public class Main {
    public static void main(String[] args) {
        // 기본 생성자를 사용하여 객체 생성
        Car defaultCar = new Car();
        System.out.println("Default car: " + defaultCar.getColor() + ", " + defaultCar.getModel() + ", " + defaultCar.getYear());

        // 매개변수가 있는 생성자를 사용하여 객체 생성
        Car myCar = new Car("Red", "KIA", 2020);
        System.out.println("My car: " + myCar.getColor() + ", " + myCar.getModel() + ", " + myCar.getYear());

        // 일부 필드만 초기화하는 생성자를 사용하여 객체 생성
        Car anotherCar = new Car("Blue", "HD");
        System.out.println("Another car: " + anotherCar.getColor() + ", " + anotherCar.getModel() + ", " + anotherCar.getYear());
    }
}

출력

Default car: Unknown, Unknown, 0
My car: Red, KIA, 2020
Another car: Blue, HD, 0

4-5 주의 사항

  • 생성자는 클래스의 이름과 동일해야 하며, 반환 타입이 없어야 합니다.

  • 생성자는 오버로딩이 가능하므로 여러개 정의할 수 있습니다.

  • 하나의 생성자에서 다른 생성자를 호출할 때는 this 키워드를 사용하며, 이 경우 호출하는 구문은 반드시 첫 번째 줄에 위치해야 합니다.

결론

  생성자는 클래스의 인스턴스를 초기화하는데 중요한 역할을 하며, 객체가 생성될 때 필드의 초기값을 설정하거나 초기 설정 작업을 수행합니다.

  생성자 오버로딩을 통해 다양한 방법으로 객체를 생성할 수 있으며, this 키워드를 사용하여 코드의 중복을 줄일 수 있습니다.



5. this 키워드 이해하기

  this 키워드는 자바에서 중요한 개념 중 하나로, 현재 객체 자신을 참조하는 데 사용됩니다.

  this 키워드를 이해하면 객체 지향 프로그래밍에서 객체와 인스턴스 변수를 다루는 방법을 명확히 이해할 수 있습니다.

5-1 현재 객체 참조

  this 키워드는 클래스의 인스턴스 메소드나 생성자 내에서 현재 객체를 참조합니다. 이는 메소드나 생성자에서 클래스의 필드와 메소드를 명확하게 접근할 수 있도록 합니다.


5-2 인스턴스 변수와 로컬 변수 구분

  가장 일반적인 사용 사례는 인스턴스 변수와 로컬 변수의 이름이 동일할 때, 이를 구분하는 것입니다. this 키워드는 인스턴스 변수를 명확하게 참조하는데 사용됩니다.

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

    // 생성자
    public Car(String color, String model, int year) {
        this.color = color;  
        // this.color는 인스턴스 변수, color는 매개변수
        this.model = model;  
        // this.model는 인스턴스 변수, model은 매개변수
        this.year = year;    
        // this.year는 인스턴스 변수, year는 매개변수
    }

    // 인스턴스 메소드
    public void setColor(String color) {
        this.color = color;  
        // this.color는 인스턴스 변수, color는 매개변수
    }
}

5-3 생성자에서 다른 생성자 호출

  this 키워드는 같은 클래스 내의 다른 생성자를 호출할 때 사용됩니다. 이를 통해 코드의 중복을 줄이고, 공통 초기화 로직을 하나의 생성자로 집중시킬 수 있습니다.

  이때 this 키워드를 사용한 생성자 호출은 반드시 생성자의 첫 번째 줄에 위치해야 합니다.

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

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

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

    // 일부 필드만 초기화하는 생성자
    public Car(String color, String model) {
        this(color, model, 0); // 다른 생성자 호출
    }
}

5-4 메소드 체이닝(Method Chaining)

  this 키워드는 메소드 체이닝을 구현할 때 사용됩니다. 메소드 체이닝은 객체의 메소드를 연속적으로 호출 할 수 있게 하는 패턴입니다. 이를 위해 메소드가 this를 반환하도록 정의됩니다.

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

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

    // 메소드 체이닝을 위한 메소드
    public Car setColor(String color) {
        this.color = color;
        return this;  // 현재 객체 반환
    }

    public Car setModel(String model) {
        this.model = model;
        return this;  // 현재 객체 반환
    }

    public Car setYear(int year) {
        this.year = year;
        return this;  // 현재 객체 반환
    }
}

// 메소드 체이닝 사용 예
public class Main {
    public static void main(String[] args) {
        Car myCar = new Car("Red", "Toyota", 2020);
        myCar.setColor("Blue")
             .setModel("Honda")
             .setYear(2022);

        System.out.println("Car: " + myCar.getColor() + ", " + myCar.getModel() + ", " + myCar.getYear());
    }
}

5-5 내부 클래스에서 외부 클래스 참조

  내부 클래스에서 외부 클래스의 인스턴스를 참조할 때 outerClass.this 형식을 사용합니다.

public class OuterClass {
    private int outerValue = 10;

    public class InnerClass {
        private int innerValue = 20;

        public void display() {
            System.out.println("Outer value: " + OuterClass.this.outerValue);
            System.out.println("Inner value: " + this.innerValue);
        }
    }
}

// 사용 예
public class Main {
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass inner = outer.new InnerClass();
        inner.display();
    }
}

요약

  • 현재 객체 참조 : this 키워드는 현재 객체를 참조합니다.

  • 인스턴스 변수와 로컬 변수 구분 : this를 사용화여 인스턴스 변수와 로컬 변수를 구분합니다.

  • 다른 생성자 호출 : 생성자 내에서 다른 생성자를 호출할 때 this를 사용합니다.

  • 메소드 체이닝 : this를 반환하여 메소드 체이닝을 구현할 수 있습니다.

  • 내부 클래스에서 외부 클래스 참조 : 내부 클래스에서 외부 클래스의 인스턴스를 참조할 때 사용됩니다.


  this 키워드는 객체 지향 프로그래밍에서 중요한 역할을 하며, 이를 잘 활용하면 코드의 가독성과 재사용성을 높일 수 있습니다.





















profile
안녕나를소개하지이름은HaBu직업은Programer취미는tai chi meditation

0개의 댓글