자바 클래스

KangMyungJoe·2020년 12월 18일
1

java_study

목록 보기
4/8
post-thumbnail

백기선님과 함께하는 Java-Study 5주차

5주차 과제: 자바 클래스
목표: 자바의 Class에 대해 학습하기

  • 클래스 정의하는 방법
  • 객체 만드는 방법 (new 키워드 이해하기)
  • 메소드 정의하는 방법
  • 생성자 정의하는 방법
  • this 키워드 이해하기

1. 클래스 정의하는 방법

클래스를 정의하기 전에, 클래스가 무엇인지 먼저 짚고 넘어가자.

클래스란?

객체를 만들기 위한 설계도, 청사진과 같은 개념
객체의 동작을 나타내는 메소드, 객체의 상태를 나타내는 속성으로 구성

직접 코드를 보며 이해하자.

// 클래스 정의
class Cat {
    // 속성(변수) 정의
	String catName;
	int catOld;
	int catHeight;

    // 생성자 정의
	public Cat(){
		
	}

    // 메소드 정의
    	public void setCatName(String catName) { // 고양이 이름 설정하기
    		this.catName = catName;
    	}
    
	public String getCatName() {  // 고양이 이름 가져오기
		return this.catName;
	}
    
    	public void setCatOld(int catOld) { // 고양이 나이 설정하기
   	 	this.catOld = catOld;
    	}
   
	public int getCatOld() { // 고양이 나이 가져오기
		return this.catOld;
	}
    
	public void setCatHeight(int catHeight) { // 고양이 키 설정하기
    		this.catHeight = catHeight;
    	}
        
	public int getCatHeight() { // 고양이 키 가져오기
		return this.catHeight;
	}

}

주석으로 간단한 설명을 추가했다. 고양이에 관한 클래스로, 고양이 이름, 나이, 키를 나타내는 변수(속성)들이 있으며, 각 변수들을 반환할 수 있는 메소드들이 존재한다. 이처럼, 고양이에 대한 설계(?)를 나타낼 수 있는 개념을 클래스라 한다.


2. 객체 만드는 방법 (new 이해하기)

앞서 만든 Cat 클래스를 이용해 객체를 생성해보자.

Cat cat1 = new Cat();
Cat cat2 = new Cat();
[클래스명] [객체명] = new [클래스명]();

위와 같이 객체는 new 키워드를 이용하여 생성한다. 이렇게 만든 객체는 클래스에서 정의한 set, get 메서드를 통해 객체의 속성들을 자유롭게 설정하고 가져올 수 있다.

new 키워드를 이용하여 생성된 객체는 JVM 메모리 영역의 Heap 메모리에 할당된다. new를 통해 생성된 녀석들은 동일한 값을 가진 다른 변수들과는 차별된다. 예시는 아래와 같다.

String str1 = "aaaa";
String str2 = "aaaa";
String str3 = new string('aaaa');

str1 == str2 --> true
str1 == str3 --> false
str2 == str3 --> false

위와 같은 결과가 나오는 이유는 객체가 다른 String 변수들과 달리, 같은 메모리 영역의 값이 아닌, 힙 영역에서 독립적으로 생성되기 때문이다.


3. 메소드 정의하는 방법

메소드란, 객체의 행동을 나타내는 함수를 뜻한다. Cat 클래스에 있는 setName, getName과 같은 함수들을 말한다. 자바의 메소드를 정의하기 위해서는 접근제어자의 사용이 중요하다.

출처

대부분 메소드는 자주 실행하는 부분의 코드 집합을 손쉽게 호출해 사용하기 위해 정의하며, 코드의 재사용성을 증가시키고 불필요한 중복을 막을 수 있다.

위에서 작성한 Cat 클래스에서 메소드를 정의하는 방법은 다음과 같다.

public void setCatName(String catName) {
	this.catName = catName;
}

위 코드는, public 제어 접근자를 사용했고, return 할 인자가 없기 때문에 void로 리턴 값을 설정했다. 또한, String catName을 파라미터로써 받아 객체의 이름으로 설정한다. this 키워드는 후 5절에서 다루도록 한다.


4. 생성자 정의하는 방법

생성자new 키워드를 이용하여 객체를 생성할 때, 동시에 개발자가 설정해놓은 내용으로써 객체의 속성을 초기화 할 수 있는 메소드를 말하며, 생성자 메소드의 이름은 클래스의 이름과 같다. 또 다른 중요한 특성으로, 오버로딩을 지원하기 때문에 여러가지 생성자를 상황에 맞게끔 설정할 수 있다.

앞서 1절에서 다룬 Cat 클래스에도 생성자가 존재한다.

public Cat() {    // 생성자

}

생성자 메소드 안에 아무런 내용이 없기 때문에, 특별한 작업이 진행되지는 않는다. 하지만 코드를 이렇게 변경하면 어떨까?

public Cat() {     // 생성자
  this.catName = 'nabi';
}

위와 같이 생성자의 내용을 변경한다면, 앞으로 Cat 클래스를 기반으로 생성된 모든 Cat 객체의 이름은 '나비'가 될 것이다.


5. this 키워드 이해하기

this 키워드란 인스턴스가 바로 나 자신을 참조하기 위해 사용하기 위한 참조 변수다. 앞에서 많이 사용한 Cat 클래스에도 this 키워드가 많이 사용된 모습을 볼 수 있다. 코드를 직접 보도록 하자.

class Cat {
    // 속성(변수) 정의
	String catName;
	
    // 생성자 정의
	public Cat(){
		
	}

    // 메소드 정의
    	public void setCatName(String catName) { // 고양이 이름 설정하기
    		this.catName = catName;
    	}
    
	public String getCatName() {  // 고양이 이름 가져오기
		return this.catName;
	}
}

이런 클래스가 있을때, 객체를 생성하고 객체 인스턴스로 catName을 활용할 수 있다. setCatName 메소드와 getCatName 메소드에서 this를 활용했는데, 실제 코드에서 this가 어떤 역할을 하는지 살펴보자.

Cat cat1 = new Cat();   // 객체 생성
Cat cat2 = new Cat();
Cat cat3 = new Cat();

cat1.setCatName('고등어');  // 객체 이름 지정
cat2.setCatName('치즈');
cat3.setCatName('깜장이');

System.out.println(cat1.getCatName());  // 객체 이름 반환
System.out.println(cat2.getCatName());
System.out.println(cat3.getCatName());



> 결과 값: 

고등어
치즈
깜장이

이런 상황에서, cat1~cat3는 모두 Cat 클래스로부터 생성된 객체들이다. 또한, 각 객체들을 setCatName 메소드를 이용해 이름을 부여하고, getCatName 메소드를 이용해 이름을 반환하도록 작성했다. 이런 경우 this

this 키워드를 사용한 녀석의~~ 라고 생각하면 좋다.

예를 들어,

  • cat1.setCatName('고등어');
    코드는 this 키워드를 cat1 객체 안 setCatName() 메소드에서 사용했다.

그러므로,

  • cat1의 속성 catName을 파라미터로써 받은 '고등어'로 설정한다.

또 다른 예로,

  • System.out.println(cat1.getCatName());
    코드 또한, this 키워드를 cat1 객체 안 getCatName() 메소드에서 사용했다.

그러므로,

  • cat1의 속성 catName(고등어)를 리턴하여 print를 통해 출력한다.

이번 주 과제 퀄리티는 형편 없다. 시험 일정과 겹친 탓에 준비를 너무 하지 못했고, 조금이라도 제출하고싶은 마음에 성급하게 작성한 것 같다. 종강했으니 다음주부턴 열심히 하자.
profile
소통을 잘하는 개발자가 되고 싶습니다.

0개의 댓글