1) 클래스와 메소드

 

 · 클래스란?

 

자, 이제 클래스에 대해서 알아보자.

"동물"이라는 클래스는 다음과 같이 만들 수 있다.

 

Animal.java


public class Animal {

}

 

위 Animal 클래스는 가장 간단한 형태의 클래스이다. 클래스의 선언만 있고 내용이 없는 껍데기뿐인 클래스이다. 하지만 이 껍데기뿐인 클래스도 아주 중요한 기능을 가지고 있다. 그 기능은 바로 객체(object)를 만드는 기능이다.

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

 


Animal cat = new Animal();

 

new 는 객체를 생성할 때 사용하는 키워드이다. 이렇게 하면 Animal 클래스의 인스턴스(instance)인 cat, 즉 Animal의 객체가 만들어진다.

※ 객체와 인스턴스

클래스에 의해서 만들어진 객체를 인스턴스라고도 한다. 그렇다면 객체와 인스턴스의 차이는 무엇일까? 이렇게 생각 해 보자.Animal cat = new Animal() 이렇게 만들어진 cat은 객체이다. 그리고 cat이라는 객체는 Animal의 인스턴스(instance)이다. 즉 인스턴스라는 말은 특정 객체(cat)가 어떤 클래스(Animal)의 객체인지를 관계위주로 설명할 때 사용된다. 즉, "cat은 인스턴스" 보다는 "cat은 객체"라는 표현이 "cat은 Animal의 객체" 보다는 "cat은 Animal의 인스턴스" 라는 표현이 훨씬 잘 어울린다.

클래스를 가장 잘 설명 해 주는 다음의 사진을 보자.

 

 

과자를 만드는 과자틀과 만들어진 과자들이다.

  • 과자틀 ==> 클래스
  • 과자틀에 의해서 만들어진 과자들 ==> 객체

이 사진을 보면 클래스가 어떤건지 감이 잡힐 것이다.

즉, 다음과 같이 무수히 많은 동물 객체들을 Animal 클래스로 만들 수 있는 것이다.

 


Animal cat = new Animal();
Animal dog = new Animal();
Animal horse = new Animal();
...

 

위 설명한 내용이 이해되었다면 클래스는 70% 이상 알았다고 해도 과언이 아니다. 클래스는 결코 어렵지 않다.

 

 · 인스턴스 변수

 

Animal 이라는 껍데기 클래스를 조금씩 발전시켜 보자. Animal 클래스로 만들어지는 객체들에 tiger, lion 등의 이름을 부여할 수 있도록 만들어 보자. 자, 이제부터는 이클립스를 열고 같이 따라해 보도록 하자.

 

Animal.java


public class Animal {
    String name;
}

 

Animal 클래스에 name 이라는 String 변수를 추가했다. 이렇게 클래스에 추가되는 변수를 인스턴스 변수라고 부른다. 또는 멤버변수, 속성이라고도 말한다.

인스턴스 변수는 위 예에서는 1개만(name 변수) 선언되었지만 여러개 필요한 만큼 선언해서 사용할 수 있다.

인스턴스 변수는 말 그대로 다음과 같이 접근할 수 있다.

 


인스턴스.변수

 

즉, Animal cat = new Animal() 처럼 cat 이라는 인스턴스가 생성되었다면 이 cat의 인스턴스 변수인 name은 다음과 같이 접근이 가능하다.

 


cat.name

 

클래스의 동작을 테스트하기 위해서 다음과 같이 main 메소드를 추가 해 보자.

 


public class Animal {
    String name;

    public static void main(String[] args) {
        Animal cat = new Animal();
        System.out.println(cat.name);
    }
}

 

이제 이 클래스를 실행시키면 main 메소드가 수행되어 다음과 같은 결과가 나올 것이다.

 


null

 

cat.name을 출력한 결과값으로 null이 나왔다. null이라는 것은 값이 할당되어 있지 않은 상태를 말한다. Animal이라는 클래스의 인스턴스 변수로 name 을 추가했지만 아무런 값도 대입을 하지 않았기 때문에 null 이라는 값이 출력된 것이다.

 

 · 메소드

 

클래스에는 인스턴스 변수와 더불어 메소드(Method)라는 것이 있다. 메소드는 클래스 내에 구현된 함수를 의미하는데 보통 함수라고 말하지 않고 메소드라고 말한다. 변수가 정적인 의미라면 메소드는 동적인 의미가 강하다. 말로 백번 하는것보다 실제 코드를 작성하는 것이 이해가 빠를 것이다.

이제 메소드를 이용하여 Animal 클래스의 인스턴스 변수인 name 에 값을 설정해 보자.

아래와 같이 setName 메소드를 추가 해 보자.


public class Animal {
    String name;

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

    public static void main(String[] args) {
        Animal cat = new Animal();
        cat.setName("boby");
        System.out.println(cat.name);
    }
}

setName 앞에 선언된 void는 메소드의 리턴타입을 말하는데 void는 리턴값이 없음을 의미한다. (※ void는 빈, 텅빈이라는 뜻이다.)

setName 메소드는 다음과 같이 입력으로 받은 문자열을 인스턴스 변수 name에 세팅한다.


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

위 코드의 this는 Animal 클래스에 의해서 생성된 인스턴스를 지칭한다. 만약 Animal cat = new Animal() 과 같이 cat이라는 인스턴스가 만들어 진다면 this는 바로 cat을 지칭하는 것이다.

※ 메소드의 입력과 출력은 다음 챕터에서 자세히 다루고 있다. 위에서 설명하는 메소드의 입력 및 출력의 의미가 잘 이해되지 않는다면 메소드 챕터를 먼저 보아도 좋다.

위 setName 메소드는 main 메소드에서 다음과 같이 사용되었다.


cat.setName("boby");

위 코드 수행 시 setName 메소드의 아래 문장이 수행된다.


this.name = name;

위 문장의 수행 과정을 단계적으로 살펴보자.

우선 입력 문자열로 "boby" 라는 값이 다음과 같이 대입된다.


this.name = "boby"

여기서 this 는 인스턴스 cat을 의미하므로 내부적으로는 다음과 같이 수행된다.


cat.name = "boby"

 

이런 과정으로 cat의 인스턴스 변수 name 에 "boby"라는 문자열이 대입된다.

위와같이 setName메소드가 호출되면 cat 인스턴스의 변수 name 에는 "boby"라는 값이 세팅될 것이다.

이제 Animal 클래스를 다시 실행 해 보자. cat.name을 출력한 결과는 다음과 같을 것이다.

 


boby

 

이상과 같이 클래스에서 꼭 알아두어야 할 필수적인 것들에 대해서 알아보았다.

  • 클래스 (Class)
  • 객체 (Object)
  • 인스턴스 (Instance)