본문 바로가기
기타/JAVA

[JAVA 1학년] 5장 객체 지향을 좀 더 알아보자

by 거북이 코딩 2023. 9. 11.

23. 객체 지향의 3대 요소

 

  • 캡슐화
  • 상속
  • 폴리모피즘

24. 보여주고 싶지 않은 것을 숨길 수 있는 '캡슐화'

 

 캡슐화란, 외부에서 사용해도 되는 필드와 메소드만 공개(public)하고, 그 밖의 필드와 메소드를 캡슐에 가두는 것처럼 비공개(private)로 하는 것입니다. 함부로 사용하면 안 되는 필드와 메소드를 외부에서 액세스할 수 없게 하면 클래스 내부를 의식하지 않고도 사용할 수 있게 되고, 안정성이 더욱 높아집니다.

 

 캡슐화하는 방법은 공개하고 싶은 필드와 메소드의 앞에는 'public'을 기술하고, 공개하고 싶지 않은 필드와 메소드 앞에는 'private'를 기술합니다. 이 public과 private를 '접근 제한자'라고 합니다.

접근 제한자 작용
private 클래스의 내부에서 액세스할 수 있지만, 클래스의 외부에서는 액세스할 수 없습니다.
public 클래스의 내부와 외부에서 모두 액세스할 수 있습니다.
없음 클래스의 내부에서도, 같은 패키지의 클래스에서도 액세스할 수 있습니다. public에 가까운 상태입니다.

패키지는 클래스파일을 모아서 그룹화한 것으로, 아무것도 지정하지 않았을 때는 '기본 패키지' 그룹이 됩니다.

 

서식 : 외부에서 이용할 수 있는 필드와 메소드
public 데이터형 필드명;
public 반환값형 메소드명(){
    메소드에서 할 처리
}
서식 : 외부에서 함부로 사용하면 곤란한 필드와 메소드
private 데이터형 필드명;
private 반환값형 메소드명(){
    메소드에서 할 처리
}

 

 일반적으로 Java에서는 필드를 private로 지정해서 직접 액세스할 수 없게 합니다. 그러므로 필드에 액세스하는 액세스 전용 메소드를 준비합니다.

 

  • getter : 값을 반환하기만 하는 메소드

 

 필드값을 읽기 위해서는 'getter(게터)'라고 하는 '값을 반환하기만 하는 메소드'를 준비합니다. 메소드 이름은 'get + 필드명'으로 붙이는 것이 일반적입니다.

서식 : getter를 사용할 때
private 데이터형 필드명;
public 데이터형 get필드명(){
    return 필드명;
}

 

  • setter : 값을 써넣는 메소드

 필드에 값을 써넣기 위해서는 'setter(세터)'라고 하는 '값을 써넣기만 하는 메소드'를 준비합니다. 메소드 이름은 'set + 필드명'으로 붙이는 것이 일반적입니다.

서식 : setter를 사용할 때
private 데이터형 필드명;
public void set필드명(데이터형 인수명){
    필드명 = 인수명;
}

 

setter 메소드를 이용하면 설정할 값을 미리 검사할 수 있습니다.

서식 : setter에 데이터 검사 기능을 넣어 사용할 때
private 데이터형 필드명;
public void set필드명(데이터형 인수명){
	if(조건식){
    	필드명 = 인수명;
    }
}

 

25. 이미 있는 클래스를 사용자화하는 '상속'

 

상속 : 원본 클래스를 이어받아(상속해서) 새로운 클래스를 만들어냅니다. 원본 클래스를 '부모 클래스(또는 슈퍼 클래스)'라고 하고, 상속해서 만들어진 클래스를 '자식 클래스(또는 서브 클래스)'라고 합니다.

 

상속하는 방법 : 자식클래스를 만들 때 'class 자식클래스명 extends 부모클래스명'이라고 지정해서 만듭니다. 자식클래스는 비어 있어도 이미 부모클래스의 필드와 메소드를 이어받은 상태입니다. 여기에 '어디가 다른지'를 기술해 갑니다. 자식클래스에 새 기능을 만들고 싶을 때는 새로운 이름으로 메소드를 만듭니다. 그 메소드는 자식 클래스에만 있는 새 기능이 됩니다. 이미 있는 기능을 수정하고 싶을 때는 원래 있는 메소드와 같은 이름으로 메소드를 만듭니다. 같은 이름으로 메소드를 만들면, 부모 클래스의 메소드를 덮어써서 사용자화 하게 되는데, 이를 '오버라이드(Override)'라고 합니다. 또한 생성자는 상속되지 않으므로 초기화가 필요할 때는 자식 클래스용 생성자를 만들어야 합니다.

서식 : 상속
class 자식클래스명 extends 부모클래스명{
	부모클래스와 다르게 처리
}

 

26. 같은 방식으로 조작할 수 있는 '폴리모피즘'

 

 폴리모피즘(다형성, polymorphism)이란, 비슷한 객체를 '같은 종류'라는 시점에서 생각해 공통된 조작 방법으로 다루는 것입니다. Java에서는 어떤 부모 클래스를 상속해서 만든 복수의 자식 클래스는 모두 부모 클래스의 성질을 이어받은 '같은 종류'로 생각할 수 있습니다. '같은 종류의 객체(오브젝트)를 같은 명령으로 조작할 수 있게 하는 것'이 폴리모피즘입니다.

 

폴리모피즘을 실현하는 방법 : 같은 방식으로 다루고 싶은 것은 '같은 종류의 클래스'로 만드는 것부터 시작합니다. 우선 부모 클래스를 준비하고, 부모 클래스를 상속한 복수의 자식 클래스를 만듭니다. 자식 클래스들이 가진 같은 이름의 메소드는 기본적으로 기능이 같습니다. 비록 오버라이드해서 내용이 바뀌었다고 해도 '비슷한 일은 각각 적합한 방법으로 실현하려고 할 뿐'이므로, '같은 명령'으로 생각할 수 있습니다. 결국 같은 종류의 객체(오브젝트)를 같은 명령으로 조작할 수 있게 됩니다. 또한 자식 클래스의 인스턴스를 넣는 변수와 배열의 데이터형을 연구하면, 효율적으로 조작할 수 있습니다. 변수나 배열의 데이터형은 '자식 클래스로 자체로만 지정'하는 게 아니라 대략적으로 ' 그 부모 클래스로 지정'할 수도 있습니다. 부모 클래스로 지정된 변수나 배열에는 여러 종류의 자식 클래스를 넣을 수 있습니다. 하나의 배열에 여러 종류의 자식 클래스를 모으면, for문 등으로 한번에 조작할 수 있습니다.

 

27. 좀 더 깊이 공부해 보는 '추상 클래스'와 '인터페이스'

 

 추상 클래스는 부모 클래스의 일종이지만, 인스턴스를 만들 수 없는 클래스입니다. 하지만 이 추상 클래스를 상속해서 만든 자식 클래스는 평범하게 인스턴스를 만들 수 있습니다. 추상 클래스는 '나를 상속한 클래스에는 이런 필드와 메소드가 있습니다.'라고 보증하기 위한 클래스입니다. 클래스 앞에 'abstract'를 붙여 사용합니다.

 

 추상 메소드는 이름만 있고 내용은 비어있는 클래스로 자식 클래스에서 반드시 내용을 변경해서 사용할 메소드를 지정하는 것입니다. 메소드 앞에 'abstract'를 붙여 사용합니다.

서식 : 추상 클래스와 추상 메소드
abstract class 추상클래스명{
	abstract void 추상메소드명();
}

 

 추상클래스와 비슷한 것으로 '인터페이스'가 있습니다. 인터페이스도 '이 필드와 메소드는 가지고 있다.'하는 것을 보증하기 위한 기능입니다. 하지만 하나밖에 상속할 수 없는 추상 클래스와 달리 하나의 클래스에 몇 개든지 붙일 수 있습니다.

 

서식 : 인터페이스
public interface 인터페이스명{
	public 반환값형 메소드명();
}
서식 : 인터페이스 구현
class 클래스명 implements 인터페이스명{
	클래스 내용
}

 

28. 앞으로 뭘 공부하면 좋을까?

 

아직도 많이 남은 Java의 기능

콜렉션(Collection), 리스트(List), 맵(Map), 트라이(Try), 캐치(Catch), 스레드(Thread)

 

무엇을 만들고 싶은지 생각해 봅시다

스마트폰 앱 만들기, 게임 만들기, 웹 만들기...

 

마치며

 

 드디어 저의 첫 Java교재 [Java 1학년]의 끝을 보게 되었습니다. 후반부에는 상속이나 인터페이스 같은 비교적 어려운 개념들이 난무 했지만 그럭저럭 이해해 나간것 같아요. 가볍게 Java를 찍먹하기엔 좋은 책인것 같습니다. 다만 이후 Java를 더 공부하고싶거나 좀 더 깊은 내용을 공부하기 원하는 분들은 다른 좀 더 상위의 교재를 보셔야 할 것 같습니다.

 

 이 책을 완독하면서 작게나마 오브젝트 스터디를 이해하는데 도움이 되었기도 하고 하나도 모르던 객체지향에 대해서 알게 되어서 뿌듯했습니다. 지금까지 제 포스팅을 봐주셔서 감사합니다.