클래스

이상민·2021년 6월 29일
0
post-thumbnail

1. 클래스 정의하기

객체의 설계도 만들기

  • 객체가 제품이라면, 클래스는 제품의 블루프린트이다

  • 데이터(멤버 변수)와 기능(메소드)들의 결합으로 이루어져있다

  • 클래스명은 주로 파스칼 케이스를 사용한다

class TV {
    String color;
    boolean power;
    int channel;
    
    void toString() {
        ...
    }
}

접근 지정자

  • 클래스, 멤버 변수, 메소드들은 다른 요소들로부터 접근 관리를 하기 위해 접근 지정자가 존재한다

  • 맨앞에 붙여서 사용한다
public class Test {
   private int num;
   protected void toString() {
       ...
   }
   ...
}

2. 객체 만들기

객체를 생성하는 것은 클래스에 정의된 내용을 메모리에 생성되는 과정이다

  • 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 하며, 객체는 특정 클래스의 인스턴스이다

  • new 연산자는 클래스 인스턴스화를 하며, JVM의 heap 영역에 객체가 생성되고 객체 주소를 반환한다

ExClass ex;          // 객체 참조 위한 참조변수 선언
ex = new ExClass();  // 객체 생성 후, 객체의 주소를 참조변수에 저장

3. 메소드 정의하기

멤버 변수가 데이터라면, 메소드는 행동과 기능이다

  • 형태 자체는 다른 언어의 함수와 같지만, 자바에서 모든 코드는 클래스 내에 존재하기 때문에 메소드라고만 부른다

  • 선언부와 구현부로 나눌 수 있다. 자바는 접근 지정, 반환 타입, 매개변수 타입이 명확하기 때문에 선언부만으로도 무슨 기능을 하는 메소드인지 추론 가능한게 자바의 장점 중 하나이다

  • 주로 스네이크 케이스로 이름을 짓는다

public int getA() {  // 선언부
    return A;        // 구현부
}

인자와 매개변수

  • 자주 헷갈리는 내용인데 인자(argument)란 메소드 호출 시 지정해주는 값들이고, 매개변수란 메소드에 정의된 입력 받을 변수들이다. 사실 명확한 구분이 무슨 필요인가 싶지만 관점도 그렇고 다르다는 것을 인지하자

4. 생성자 정의하기

인스턴스 생성 시 호출되는 메소드

  • 객체의 데이터를 초기화하기 위해 주로 사용된다

  • 클래스와 이름이 같은 메소드는 생성자로 인식된다

  • 오버로딩을 통해 여러 생성자를 만들 수 있다. 이때 서로 다른 생성자는 매개 변수의 개수가 다르거나 또는 순서가 달라야한다. 매개변수 이름만 달라서는 오버로딩이 되지않는다

  • 생성자를 작성하지 않을 시 컴파일러가 매개변수가 없는 생성자를 자동 생성하기 때문에 문제가 발생하지 않지만, 생성자를 하나라도 작성할 시 자동으로 생성되지 않기 때문에 신경써야한다

class User {
    String name;
    int age;
    
    User() {}
    User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

5. this 키워드 이해하기

this란 참조변수로 인스턴스 자신을 가리킨다

  • 인스턴스 멤버만이 this를 사용할 수 있다

  • this 자체도 참조변수이기 때문에 인스턴스의 주소가 저장되어 있다

  • this() 형태로 생성자를 나타낼 수도 있다

class Rectangle {
    private int x, y;
    private int width, height;
    
    Rectangle() {
        this(0,0,1,1);
    }
    
    Rectangle(int width, int height) {
        this(0,0,width,height)
    }
    
    Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
}
profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글