[Java-OOP1] 클래스

이용준·2022년 10월 27일
0

Java

목록 보기
14/29

지금부터 클래스에 대해 알아보도록 하자. 클래스에 대해 개념적 설명보단 간단한 클래스부터 규모를 키워가는 방식으로 진행하도록 한다.

  1. 객체에 대하여
  2. 객체 변수(Instance Variable)
  3. 메소드
  4. 객체 변수는 공유되지 않는다.

1.객체에 대하여

먼저 Animal 클래스를 Test.java 파일에 작성해보도록 한다.

class Animal{
}

public class Test{
  public static void main(String[] args){
  }
}  

보통 클래스는 특별한 경우가 아니라면 파일 단위로 작성해야 한다.

위 클래스는 가장 간단한 형태의 클래스로

  • 선언만 있음(Animal)
  • 내용 없는 껍데기 클래스

다음과 같은 특징을 가지고 있다. 하지만 껍데기뿐인 클래스도 중요한 기능을 가지고 있는데, 그 기능은 객체(object)를 만드는 기능이다.

객체는 다음과 같이 만들 수 있다.

class Animal{
}
public class Test{
  public static void main(String[] args){
    Animal cat = new Animal();
  }
}  
  • new는 객체를 생성할 때 사용하는 키워드이다.

  • 위 과정을 통해 Animal의 객체가 만들어진 것이다.(cat은 Animal의 인스턴스이다.)

    클래스를 가장 잘 설명한다는 붕어빵 틀(Class)붕어빵(object)을 예로 들 수 있는데 필자는 이 예제가 추상적이라 더 헷갈리는 것 같다.
    대신 아래와 같은 예제로 이해해보자.

    class Animal{
    }
    
    public class Test{
      public static void main(String[] args){
        Animal cat = new Animal();
        Animal dog = new Animal();
        Animal bird = new Animal();
        Animal lion = new Animal();
      }
    }  

    Animal 클래스를 만듦으로써 cat, dog, bird, lion 객체를 생성했다.(찍어냈다.)

2.객체 변수(Instance variable)

위에 생성한 Animal 클래스에 변수(name)를 추가해보자.

class Animal{
  String name; // 객체 변수
}

public class Test{
  public static void main(String[] args){
    Animal cat = new Animal();
    System.out.println(cat.name);  // null 출력
  }
}  

이렇게 Animal에 클래스에 선언된 name은 객체 변수라고 하며, 객체 변수는 인스턴스 변수, 멤버 변수, 속성이라고 한다.

클래스 > 객체 > 객체 변수

클래스를 통해 생성된 객체를 인스턴스라 하며 클래스로부터 객체를 만드는 과정을 인스턴스화라 한다.
그렇다면 객체와 인스턴스의 차이는 무엇일까?

객체와 인스턴스의 차이

두 용어는 크게 차이가 없으며 때에따라 혼용할 수 있지만 엄밀히 구분하자면 아래와 같은 차이가 있다.

  • 객체는 모든 인스턴스를 포괄하는 넓은 의미
  • 인스턴스는 해당 객체가 어던 클래스로부터 생성된 것인지 강조

3.메소드(method)

메소드는 클래스 내에 구현된 함수를 의미하는데 보통 함수라 하지않고 메소드라 한다.
 메소드를 이용해 Animal 클래스의 객체 변수인 name에 값을 대입해보자.

* setName 메소드를 추가해보자.
class Animal{
  String name;
  
  public void setName{
    this.name = name;
  }
}  
public class Test{  
  public static void main(String[] args){
     Animal cat = new Animal();
     System.out.println(cat.name);
   }
 }  

Animal 클래스에 추가된 setName 메소드는 다음과 같은 형태이다.

  • 입력 : String name
  • 출력 : void(리턴값 없음)
    • name을 입력받고 출력은 없는 형태의 메소드(setName)

setName 메소드를 호출할 수 있도록 main 메소드를 수정해보자.

class Animal{
  String name;  //1) 필드
  
  public static setName{ // 2) 메서드
    this.name = name;
    }
    Animal{...} //3) 생성자
    class AnimalSubClass{}// 4) 이너클래스
  }
  
  public class Test{
    public static void main(String[] args){
      Animal cat = new Animal();
      cat.setName("Tom"); //메소드 호출
      System.out.println(cat.name);
    }
  }
    
  이 과정에서 this.name = "Tom"; 은 
  cat.name = "Tom"와 같이 해석된다.

위 1) ~ 4) 요소는 다음과 같다

 1) 필드 - 클래스의 속성 표시.(ex-컴퓨터의 색상, 사양, 용량 등)
 2) 메서드 - 클래스의 기능 표시(ex - 컴퓨터에서 게임하기, 블로그작성, 연산하기등)
 3) 생성자 - 클래스의 객체 생성 역할
 4) 이너 클래스 - 클래스 내부의 클래스

4.객체 변수는 독립적이다.

객체 변수는 공유되지 않는다. 예제 코드를 통해 공유되지 않는다는 말이 무엇인지 알아보자.

class Animal{
  String name;
  
  public void setName(String name){
    this.name = name;
  }
}  

public class Test{
  public static void main(String[] args){
    Animal cat = new Animal();
    cat.setName("Tom"); // 메소드 호출
    
    Animal bird = new Animal();
    bird.setName("hardy"); // 메소드 호출
    
    System.out.println(cat.name);
    System.out.println(bird.name);
  }
}  

위 cat과 bird의 name은 각각 Tomhardy가 나오게 된다. 만약 name 객체 변수가 공유되었다면 마지막에 입력된 hardy만 나왔을 것이다. 이를 통해 클래스의 객체 변수 값은 독립적으로 유지된다는 점을 유념하자.

객체 변수 값은 공유되지 않으나 static을 이용하면 객체 변수를 공유하도록 만들 수도 있다.

profile
뚝딱뚝딱

0개의 댓글