5장. 클래스

3 minute read

목표

자바의 클래스에 대해 학습하세요. issue

학습할 것

  • 클래스 정의하는 방법
  • 객체 만드는 방법 (new 키워드 이해하기)
  • 메소드 정의하는 방법
  • 생성자 정의하는 방법
  • this 키워드 이해하기

클래스란

클래스는 객체를 만들기 위한 설계도 혹은 개념입니다. 예를 들어 사람을 프로그래밍 내에서 사람이라는 개념을 사용한다면 사람에 대한 정보를 정의해 놓는 것이 클래스이고 실체하는 것은 인스턴스입니다. 실제 동작하는 객체를 만들기 위해서는 클래스라는 틀을 정의해서 그것을 활용해서 객체를 만들어야 한다.

클래스 정의

(접근 제어자) class (class 이름) {
    ...
}

---

public class School {

}

클래스같은 경우 default와 pulbic 이 2가지 경우밖에 사용이 가능합니다. public은 심지어 파일명과 클래스이름이 같은 때만 사용가능한다. inner class인 경우는 다릅니다.

접근 제어자

  • public: 모든 패키지에서 사용 가능
  • protected: 같은 패키지나 상속받은 클래스에서 사용 가능
  • default: 같은 패키지에서 사용 가능, 접근 제어자를 생략하면 default가 됨
  • private: 해당 클래스 내부에서만 사용 가능

생성자

생성자는 클래스를 실체(인스턴스)화 시킬 때 사용합니다. 생성자 안에는 초기화할 것 들을 작성해주면 됩니다.

public class School {
    private String name;
    private String address;

    public School() {}

    public School(String name) {
        this.name = name;
    }

    public School(String name, String address) {
        this.name = name;
        this.address = address;
    }

}

---

School school = new School("우리고등학고");
  • 생성자를 생성하지 않은 경우에는 기본적으로 아무것도 하지 않은 생성자가 class 내부에 생성되어서 사용되어진다.
  • 생성자를 사용할 때 여러 파라미터가 바뀌도록해서 메소드 오버로딩처럼 사용할 수 있다.
  • 생성자 오버로딩 같은 여러 파라미터가 점점 늘어나는 경우 계속 생성자를 만들기가 어렵기 때문에 builder을 이용해서 유연하게 생성자를 만들수 있도록 할 수 있다.

  • new 라는 키워드를 사용해서 해당 클래스에 대해서 인스턴스를 만들 수 있다.

추가적인 블록

  • 정적 블록 스태틱 변수를 초기화할 때 사용된다. 바로 선언해서 사용할 수도 있지만 그렇지 않고 조금 복잡하게 선언하고 싶은 경우 사용.
    class School {
      public static int number;
    
      static {
          number = 10;
      }
    }
    
  • 인스턴스 블록 인스턴스에서 사용되는 변수를 초기화할 때 사용.
class School {
    public int name;

    {
        name = "우리고";
    }
}

블록 실행 순서

정적 블록 -> 인스턴스 블록 -> 생성자

메소드

메서드는 객체의 행동을 정의합니다. 사람은 말할 수 있고, 걸을 수 있을 것입니다. 이러한 행위 자체를 메서드로 정의하여 사용하면 됩니다.

<접근제어자> <반환 타입> 메서드명(파라미터) {
    내용
    return 반환값 //없을 시 생략 가능
}

인스턴스 메소드

인스턴스가 생성되었을 때 사용이 가능한 메소드. 인스턴스 변수와 클래스 변수 모두 사용 가능.

class School {
    public int name;

    public School (String name) {
        this.name = name;
    }

    public void print() {
        System.out.println("학교이름: " + name);
    }
}

클래스 메소드

클래스 메서드는 인스턴스가 아닌 클래스에 종속되는 메서드입니다. 클래스 변수와 마찬가지로 인스턴스 메서드 처럼 선언한 후 static 키워드를 붙여 사용하며 클래스 메서드 내부에서는 클래스 변수만 사용 가능합니다.

class School {
    public static int name = "우리고";

    public static void print() {
        System.out.println("학교이름: " + name);
    }
}

메서드 오버로딩

자바에서는 메서드를 메서드 시그니처를 통해 구별할 수 있기때문에, method overloading을 지원합니다. 따라서 같은 이름의 메서드여도 파라미터 타입이 다르거나 파라미터의 갯수가 다르면 선언이 가능합니다. 하지만 반환 타입은 메서드 시그니처가 아니기때문에 반환 타입만 다른 경우는 선언할 수 없습니다.

public class School {

    public void print(int number, String name) {
        //...
    }

    public void print(int number) {
        //...
    }

    public void print(String name) {
        //...
    }
}

this

  • 자기 자신의 인스턴스를 가리키는 지시자 this는 자기 자신의 인스턴스를 가리킬 때 사용합니다. this 뒤에 접근 지시자를 붙여 변수나 메서드를 호출할 수 있습니다. 생성자나 메서드의 파라미터와 인스턴스 필드의 변수명이 같을 때 구분하는 용도로도 사용이 가능합니다. 인스턴스를 가리키기 때문에 클래스 변수나 클래스 메서드는 가리킬 수 없습니다.
public class School {
    private String name;
    private String address;

    public School() {}

    public School(String name) {
        this.name = name;
    }

    public School(String name, String address) {
        this.name = name;
        this.address = address;
    }

}
  • 생성자 오버로딩시 다른 생성자 호출 생성자 오버로딩을 할 때 다른 생성자를 내부에서 호출해야 한다면 this를 사용하여 호출하면 됩니다. 이 경우 해당 생성자에서 직접 생성하는 것이 아니라 this로 호출한 생성자로 생성을 위임을 하는 것입니다.
public class School {
    private String name;
    private String address;

    public School() {
        this("우리고", "우리집근처")
    }

    public School(String name) {
        this(name, "우리집 근처")
    }

    public School(String name, String address) {
        this.name = name;
        this.address = address;
    }

}

Another class

Nested class

자바 프로그래밍에서는 한 클래스 내부에 다른 클래스를 선언할 수 있습니다. 이러한 클래스를 Nested Class, 즉 중첩클래스라고 합니다.

  • 중첩 클래스를 사용하는 이유
    • 한 곳에서만 사용되는 클래스들을 논리적으로 그룹화할 수 있기 때문입니다.
    • 캡슐화를 증가시킬 수 있기 때문입니다.
    • 좀 더 읽기 쉽고 유지보수하기 쉬운 코드로 이어질 수 있기 때문입니다.
  • Static Nested Class와 inner class가 있음.

Anonymous Class

선언과 동시에 인스턴스화가 가능하다.

  1. Interface를 implemets 를 받아 사용한다.
  2. Class를 상속 받아서 사용한다.
public interface Printer {
    void print();
}

public static void main(String args[]){
    Printer printer = new Printer() {
        public void print() {
            ...
        }
    }

    printer.print();

}
  • Anonymous Class로 만들어진 클래스는 실제 해당 class는 아니다.
    • 실제로 print를 했을 때 다른 다른 클래스로 인식된다.

ref

lee_maru님의 블로그

byungjun25님의 github

hyperneva1의 블로그

베스트 글 모음

  • https://github.com/ByungJun25/study/tree/main/java/whiteship-study/5week

  • https://ahnyezi.github.io/java/javastudy-5/

  • https://github.com/hypernova1/TIL/tree/master/java/live-study/05.%20%ED%81%B4%EB%9E%98%EC%8A%A4

  • lee_maru님의 블로그

    • https://catch-me-java.tistory.com/37
    • https://catch-me-java.tistory.com/38
    • https://catch-me-java.tistory.com/39
    • https://catch-me-java.tistory.com/40

Leave a comment