자바/그림으로 배우는 JAVA

[Lesson 9] 클래스의 기능

hooooolly 2024. 6. 29. 14:36

멤버에 대한 접근 제한

private 접근 제한자는 클래스의 멤버가 클래스 외부로부터의 접근에 노출되어 있으면 사용자가 잘못된 값을 대입하는 경우가 있기 때문에 멤버에 재약을 걸어서 클래스 외부에서 마음대로 접근할 수 없는 멤버를 만든다. public set 메소드를 사용해서 전달된 값을 if 문으로 올바른 값인지 확인한 다음 필드에 저장해서 잘못된 값이 저장될 가능성을 없앤다. 이처럼 클래스의 필드와 메소드를 하나로 묶어 구성원을 보호하는 기능캡슐화 (encapsulation) 라고 하는데, 보호하고 싶은 멤버에 private을 붙여 접근을 제한하는 역할을 한다. 일반적으로 필드는 private 으로, 메소드는 public 멤버로 지정한다.

 

메소드의 오버로딩

같은 이름을 가지는 메소드 여러 개를 같은 클래스 내부에 정의 하는 것을 메소드의 오버로딩 (overloading, 중복 정의) 라 부른다. 오버로딩을 설계하는 이유는 유사한 처리에 대해 동일한 메소드 이름을 사용할 수 있기 때문에 알기 쉽고 사용하기 편리한 코드를 작성할 수 있다. 오버로딩 메소드를 호출할 때 전달되는 인수의 형과 개수가 일치하는 메소드가 자동적으로 호출된다. 인수의 형과 개수가 동일하면 컴파일러가 어느 메소드를 호출해야 하는지 판단하지 못하기 때문에 반드시 다르게 설정해야 한다.

 

생성자

생성자는 클래스의 이름과 같고 메소드와 달리 리턴값이 없는 기능을 생성자(constructor)라고 한다. 아래의 표로 생성자와 메소드를 비교해 보았다.

  생성자 메소드
이름 클래스의 이름과 같다 클래스의 이름과 다르다
리턴값 무/유
실행시점 클래스의 객체가 생성될 때 자동으로 실행 자유롭게 호출
오버로딩 가능 가능
목적 객체의 초기화 (초기 설정) 어떠한 기능을 동작시켜 원하는 결과를 도출
접근제한자 모두 가능 (private일 경우 클래스 외부에서 생성자를 호출하여 객체를 만들 수 없음) 모두 가능

 

 

인스턴스와 클래스

인스턴스 변수, 인스턴스 메소드는 객체(메모리에 올라간 클래스)를 만들어야 사용할 수 있는 객체에 연결된 필드를 말한다. 객체에 연결되지 않고 클래스 전체에 연결된 필드를 클래스 변수, 클래스 메소드라고 부른다. static을 필드 앞에 붙이면 클래스 전체에서 다루는 데이터를 저장하는 필드가 되고 클래스 메소드는 객체를 생성하지 않더라도 호출할 수 있는 기능을 가진다. 클래스 메소드는 클래스 변수를 출력하거나 클래스의 객체 전체와 연결된 처리를 해야 할 때 사용하는 메소드 이다. 클래스 메소드를 호출할 때는 Car.show(); 와 같이 클래스명.클래스 메소드(); 로 호출한다. 인스턴스 멤버만으로는 객체들 사이의 데이터와 기능을 공유하는데 불편하기 때문에 이러한 클래스 전체와 연결된 멤버를 사용해 편리하게 공유할 수 있다.

 

※ 클래스 변수와 클래스 메소드는 public 만 가능하다

※ 메소드 메모리 영역에 저장되어 모든 실행이 끝날 때 까지 존재하기 때문에 메모리 낭비를 유의해서 써야한다

※ 클래스 메소드는 특정 객체와 연결되지 않았기 때문에 특정 객체 스스로를 가리키는 'this.' 키워드를 사용할 수 없다

※ 객체가 생성되지 않은 상태에서도 클래스 메소드를 호출할 수 있기 때문에 클래스 메소드 안에서는 인스턴스 멤버에 접근할 수 없다

 

class Car {
	int num ; <- 인스턴스 변수
    static int sum; <- 클래스 변수
    void setCar(int a) { <- 지역 변수
    	int b; <- 지역 변수
    }
}