본문 바로가기

플밍 is 뭔들/JAVA

[자바] 클래스

※ 클래스란?
 객체지향 프로그래밍에서 로직과 데이터를 묶어놓은 하나의 단위 혹은 객체를 정의해놓은 것으로써 객체를 생성하는데 사용된다.


※ 클래스와 객체
위에서 말했듯 클래스는 객체를 생성할 때 사용된다.
가장 흔하게 사용되는 비유가 붕어빵과 붕어빵틀로 비유한다.
클래스는 붕어빵을 만드는 틀이고 그 틀에서 만들어진 붕어빵은 객체라고 한다.
아래 직접 코드로 예를 들어보자.

ex) 
Cat yaOngE = new Cat();
Cat navi = new Cat();
Cat nyan = new Cat();
...

Cat이라는 클래스에 고양이에 관한 데이터, 메서드 들이 정의되어 있다.
이러한 클래스를 이용하여 세개의 고양이 객체(야옹이,나비,냥)를 만들었다.
즉 Cat이라는 클래스 안에 고양이에 대한 로직 데이터를 정의해 놓음으로써 그것을 이용하여 세마리의 고양이 객체를 생성했다.
물론 그 세마리의 고양이 객체는 같은 클래스에서 생성되었지만 서로 다른 객체이므로 독립적인 존재이다.


※ 객체와 인스턴스 비교
자바를 공부하다보면 객체와 인스턴스란 개념이 나온다.
둘다 같은 의미 이므로 두 용어의 사용을 엄격히 구분할 필요는 없지만 문맥에 따라 구별하여 사용하는것이 좋다.

 클래스 -----(인스턴스화)-----> 인스턴스(객체)

위에서 보면 클래스에서 객체를 생성하는 과정 사이를 인스턴스화 한다고 한다. 즉 두 개념을 구분하는 방법은 클래스와 생성된 객체와의 관계위주로 설명할 때는 인스턴스라 한다. 즉 인스턴스는 어떤 클래스로부터 생성 되었는지를 강조하는 보다 구체적인 의미를 갖고 있다. 
Cat navi = new Cat() 에서 navi는 Cat의 인스턴스이다. 라고 말하는게 좋다.
그리고 객체 자체만을 두고 표현할 때, navi는 객체이다. 라고 하는것이 더 자연스럽다.


※ 클래스변수(static변수)와 인스턴스변수
클래스 변수는 객체를 생성하지 않고도 접근이 가능하다. 하지만 인스턴스 변수는 반드시 인스턴스를 생성해야 된다.
클래스 변수는 공유변수라고도 하며 한 클래스의 모든 변수들이 공통적인 값을 유지해야 하는 속성의 경우 클래스 변수로 선언한다.
ex) 카드의 속성을 클래스로 정의할 때 그 안의 숫자와 모양은 다르지만 높이와 폭은 모두 같아야 한다.
그렇기 때문에 폭과 높이는 클래스 변수로 선언하여야 한다.

public class Card{
    
    int number;
    String kind;
    static int width;
    static int height;

}

public void main(String[] args){
    
    Card.width = 100; //클래스 변수이므로 인스턴스를 생성하지 않고도 접근 가능
    Card.height = 250; //클래스 변수이므로 인스턴스를 생성하지 않고도 접근 가능

    Card card = new Card();

    card.number = 7; //인스턴스 변수이므로 인스턴스 생성 후 접근 가능
    card.kind = "space"; //인스턴스 변수이므로 인스턴스 생성 후 접근 가능
}




※ 클래스메서드(static메서드)와 인스턴스메서드
클래스메서드와 인스턴스메서드의 특징은 위의 클래스변수/인스턴스변수의 특징과 같다.
그렇다면 이 메서드들은 어떨때 사용해아 할까?
인스턴스 메서드는 인스턴스변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로하는 메서드이다.
클래스 메서드는 인스턴스변수나 인스턴스메서드를 사용하지 않는 메서드를 클래스 메서드로 정의한다.
물론 인스턴스 변수를 사용하지 않는다고 클래스 메서드로 무조건 정의해야하는것은 아니다. 하지만 static을 붙이는 것을 고려해 보아야 한다.
그리고 클래스 메서드에서는 인스턴스 변수를 사용할 수 없다.
public class Card{
    
    int number;
    String kind;
    static int width;
    static int height;

    
    public void method1(){
        
         number = 7;
              kind = "space";
         width = 100;
         height = 250;
    }

    static public void method2(){

         width = 100;
         height = 250; 
              number = 7;    //에러, 인스턴스 변수 사용 불가
              kind = "space";  //에러, 인스턴스 변수 사용 불가
    }
}



※ 생성자
인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드' 로써 생성자의 이름은 클래스 이름과 같아야 하고 리턴 값이 없다.
생성자는 매개변수가 있어도 되고 없어도 된다. 
만약 생성자를 사용자가 정의하지 않으면 컴파일러가 자동으로 추가되는데 빈 생성자라고 생각하면 된다.
class Card{
    
    int number;
    String kind;

    //생성자
    Card(){
        //값 초기화
    }

    //생성자
    Card(String kind, int number){
        //값 초기화
        this.number = number;
        this.kind = kind;
    }
}


※ 생성자에서 다른 생성자 호출하기
이럴때는 this를 사용한다. this는 인스턴스 자신을 가르키는 참조변수로 인스턴스의 주소가 저장되어 있다.
this는 모든 인스턴스에서 지역변수로 숨겨진 채로 존재한다.
그리고 this는 인스턴스 자신을 가르키므로 this.변수와 같은 방식으로 자기 자신의 변수접근이 가능해진다.
마찬가지로 메서드 또한 this.메서드()와 같은 방식으로 호출이 가능하며 this()는 생성자를 호출한다.
class Card{
    
    int number;
    String kind;

    //생성자
    Card(){
        //생성자 호출
        this("space", 7);
    }

    //생성자
    Card(String kind, int number){
        //값 초기화
        this.number = number;
        this.kind = kind;
    }
}