본문 바로가기

IT/JAVA

자바 클래스 - 백기선님 스터디 5주차 과제

목표

자바의 Class에 대해 학습하세요.

학습할 것 (필수)

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

클래스 정의하는 방법

클래스란 '객체를 정의해 놓은 것.' 또는 '객체 설계도 또는 틀'이라고 할 수 있다.

클래스에는 객체가 가지는 공통적인 속성과 기능들이 정의되어있다. 이 속성들을 매개변수 또는 필드라고 주로 부르며 기능은 메서드라고 부른다.

클래스를 이용해 여러개의 객체를 만들 수 있다.

class 클래스명{
    멤버변수
    메소드
    생성자			// 필수이나 생략가능하다. 아래 생성자 탭에서 설명.
}

ex)
class Lion{
    String name;
    int age;
    
    void growth(){
    	age++;
    }
    
    Lion(){
    	⋮
    }
}

 

객체 만드는 방법 (new 키워드 이해하기)

클래스를 이용해서 객체를 만들 수 있다. 이 과정을 인스턴스화 한다고 하며 인스턴스화를 통해 만들어진 객체를 인스턴스라고 한다.

하나의 클래스로 여러 개의 인스턴스를 만들 수 있으며, 각각의 인스턴스는 독립적으로 존재한다.

연산자 new에 의해 클래스의 인스턴스가 메모리의 빈 공간에 생성되고, 인스턴스의 주소가 변수에 저장된다.

클래스명 변수명; 			// 클래스의 객체를 참조하기위한 변수 선언
변수명 = new 클래스명();	// 클래스의 객체를 생성한 후 객체의 주소를 참조 변수에 저장

ex)
Lion simba;
simba = new Lion();

 

메서드 정의하는 방법

메서드는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다. 재사용함으로써 중복된 코드를 줄일 수 있다.

반환타입 메소드명 (타입 변수명, 타입 변수명, ⋯) // 선언부
{						// 구현부
	// 메소드 호출 시 실행 코드
}

ex)
int add(int a, int b){
	return a + b;
}

 

메소드는 선언부와 구현부로 이루어져 있다.

선언부

반환 타입, 메서드명, 매개변수 선언으로 이루어져 있다.

반환 타입은 메서드 작업 후 출력하는 결과물의 타입이다. 반환하는 값이 없을 경우 void를 적어준다.

메서드명은 명명규칙에 따라 작성하면 된다. 이름만 봐도 어떤 작업을 수행하는지 알 수 있도록 작성하는 것이 좋다.

매개변수 선언은 메서드가 작업을 수행하는데 필요한 값들을 제공받기 위한 것이다. 필요한 값이 없다면 빈 괄호()로 두면 된다. 필요한 개수만큼 변수를 선언하며 쉼표, 로 각 변수를 구분한다.

일반적인 변수 선언과는 달리, 각 변수의 타입이 같더라도 각각의 변수 타입을 전부 적어줘야 한다.

구현부

메서드 실행 시 수행할 문장을 적어주면 된다.

메서드에는 적어도 하나의 return문이 있어야 한다. 반환 값이 없을 경우 return문이 없어도 에러가 나지 않은 이유는 컴파일러가 자동으로 메서드의 마지막에 return;를 추가해주기 때문이다.

반환 타입이 있을 경우 return 반환 값; 구문을 사용해 값을 반환해준다. 당연히 반환 값에 들어가는 변수의 타입은 반환 타입과 같거나 적어도 자동 형 변환이 가능한 것이어야 한다.

 

생성자 정의하는 방법

생성자는 클래스에 존재하며 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.

생성자의 이름은 클래스와 같아야 한다. 메서드와 유사하게 생겼지만 생성자는 반환 값이 없다.

하나의 클래스에 여러 개의 생성자가 존재할 수 있으며 각각의 생성자는 모두 다른 매개변수를 가져야 한다.

class Lion{
    Lion(){				// 매개변수가 없는 생성자
    	⋮
    }
    
    Lion(String name, int age){		// 매개변수가 있는 생성자
    	⋮
    }

}

 

기본 생성자

클래스에는 하나 이상의 생성자가 있어야 한다. 생성자가 객체를 초기화해 주기 때문이다. 생성자가 없다면 객체 생성 후 각각의 속성에 접근해 하나하나 초기화를 해야 하는 불상사가 발생했을 수도 있다.

그러나 우리가 클래스를 작성할 때 생성자를 만들어 주지 않아도 프로그램이 실행되는데, 이는 생성자가 하나도 없을 경우 컴파일러가 기본 생성자를 만들어주기 때문이다. 

클래스이름(){}

ex)
Lion(){}

 

기본 생성자는 우리가 선언한 생성자가 하나도 없을 때만 컴파일러가 추가해 주기 때문에 아래와 같은 상황은 오류가 발생한다.

Class Lion{

    Lion(String name){
    	⋮
    }
}

Class Test{
    public static void main(String[] args){
    	Lion simba = new Lion();
    }
}

 

Lion(String name)이라는 생성자를 선언해줬기 때문에 컴파일러는 다른 생성자를 추가하지 않는다.

 

this 키워드 이해하기

this는 참조 변수로 인스턴스 자신을 가리킨다.

생성자를 포함한 모든 인스턴스 메서드에는 자신이 관련된 인스턴스를 가리키는 참조변수 this가 지역변수로 숨겨진 채로 존재한다. 

참조 변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼, this로 인스턴스 변수에 접근할 수 있다. 

생성자에서 this를 이용하여 다른 생성자를 호출할 수 있다. 이때 반드시 첫 줄에서만 사용해야 하며 this() / this(매개변수)와 같이 사용한다.

매개 변수와 인스턴스 변수 명이 동일할 때 인스턴스 변수 앞에 this를 붙임으로써 둘을 구분할 수 있다.

class Lion{
    String name;
    int age;
    
    Lion(String name, int age){
    	this.name = name;		//인스턴스변수 name에 생성자를 호출할때 넘긴 매개변수 name을 저장한다.
        this.age = age;
    }
}