본문 바로가기
개발/JAVA

[JAVA] 클래스

by 경주초이 2020. 6. 8.

클래스란?

Animal.java

public class Animal {

}

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

객체는 다음과 같이 생성한다.

Animal cat = new Animal();

new 는 객체를 생성할 떄 사용하는 키워드이다. 이렇게 하면 Animal 크랠스의 인스턴스인 cat, 즉 Animal 객체가 만들어진다. 

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

  • 과자를 만드는 틀 → 클래스(Class)
  • 과자틀에 만들어진 과자들 → 객체(Object)

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

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

 

객체 변수 (Instance variable)

Animal이라는 껍데기 클래스를 조금 더 바런시켜 Animal 클래스에 의해 마늗ㄹ어지는 동물들에 이름을 지어주자.

Animal.java

public class Animal { 
	String name;
}

Animal 클래스에 name이라는 String 변수를 추가했다. 이와 같이 클래스에 선언된 변수를 '객체변수'(인스턴스 변수, 멤버변수, 속성)라고 부른다. 
클래스에 의해 생성되는 것은 객체, 그리고 그 클래스에 선언된 변수는 객체 변수라고 생각하면 쉽다. 

객체 변수를 생성했으니 객체 변수를 사용해 보도록 하자. 먼저 객체 변수는 변수이므로 값을 대입할 수 있다. 대입하기 전, 객체 변수는 현재 어떤 값을 가지고 있는지 먼저 출력 해 보자. 
객체 변수를 출력하려면 객체 변수에 어떻게 접근해야 하는지 먼저 알아야 한다. 
객체 변수는 다음과 같이 도트연산자(.)를 이용하여 접근할 수 있다. 

객체.객체변수

즉, Annimal cat = new Animal() 처럼 cat이라는 객체를 생성했다면 이 cat 객체의 객체 변수 name에는 다음과 같이 접근할 수 있다. 

cat.name

이제 객체 변수에 어떤 값이 대입되어 있는지 다음과 같이 출력해보자. 

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


null

 

메소드

객체 변수에 값을 대입하는 방법에는 여러가지가 있을 수 있지만, 가장 보편적인 방법에 대해 알아보자.

클래스에는 객체 변수와 더불어 메소드(Method)라는 것이 있다. 메소드는 클래스 내에 구현된 함수를 의미하는데 보통 함수라고 말하지 않고 메소드라 한다. 

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

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

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

  • 입력: String name
  • 출력: void

객체 변수에 접근하기 위해서 객체.변수 와 같이 도트연산자로 접근할 수 있었던 것과 마찬가지로 객체가 메소드를 호출하기 위해서는 객체.메소드 로 호출할 수 있다. 

즉, 우리가 만든 setName메소드를 호출하려면 다음과 같이 호출해야 한다. 

cat.setName("baby");

여기서 setName메소드의 입력으로 String을 전달해야 한다. 왜냐하면 setName메소드는 입력항목으로 문자열을 필요로 하기 떄문이다. 

setName메소드를 호출할 수 있도록 main메소드를 다음과 같이 수정해보자.

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


baby

 

객체 변수는 공유되지 않는다

이번에는 main 메소드를 다음과 같이 변경해 보자.

public static void main(String[] args) {
	Animal cat = new Animal();
    cat.setName("baby");
    
    Animal dog = new Animal();
    dog.setName("puppy");
}

이 경우 setName메소드에 의해 다음과 같은 문장이 두 번 실행될 것이다.

cat.name = "baby";
dog.name = "puppy";

객체 변수가 공유 된다면 cat.name의 값도 "puppy"가 되어야 하지만 객체 변수는 공유되지 않으므로 cat.name은 baby, dog.name = puppy가 된다.

'개발 > JAVA' 카테고리의 다른 글

[JAVA] Call by Value  (0) 2020.06.11
[JAVA] 메소드  (0) 2020.06.10
[JAVA] 제어문 - for each  (0) 2020.06.06
자료형 - 8. 맵  (0) 2020.06.04
자료형 - 7. 제네릭스  (0) 2020.06.02