좋은 프로그램은 무한한 자유도가 주어지는 프로그램이 아니라 적절한 제약을 제공하는 프로그램이다.

 

접근 제어자란?

접근 제어자를 사용하면 해당 클래스 외부에서 특정 필드나 메서드에 접근하는 것을 허용하거나 제한할 수 있다.

  • 접근 제어자 존재 이유
    • 외부에서 객체의 모든 필드에 접근 가능하다면 시스템에서 의도하지 않는 값이 필드에 설정될 수 있기 때문에 부작용을 일으킬 수 있다.
    • 필드에 접근 제어자로 접근 제한을 걺으로써 예상치 못한 작동(ex. 값 설정)을 미리 예방할 수 있다.
  • 접근 제어자 핵심
    • 캡슐화 : 속성과 기능을 외부로 숨기는 것

 

예시 - private volume

웬만하면 객체의 필드에는 private 접근제어자를 사용하자.

package access;

public class Speaker {
	private int volume; // 접근제어자 private
	...
}

 

 

→ volume 필드는 이제 Speaker 내부에서만 접근 가능하다.

 

접근 제어자 종류

  • private : 모든 외부 호출을 막는다.
  • default(package-private) : 같은 패키지 안에서 호출만 허용한다.
  • protected : 같은 패키지 내의 다른 클래스에서 접근 가능. 패키지가 다를 경우 상속 관계의 호출만 가능하다.
  • public : 모든 외부 호출을 허용한다.
  • 차단 순서
  • 사용 위치

 

캡슐화

캡슐화는 속성과 기능을 하나로 묶고, 외부에 꼭 필요한 기능만 노출하고 나머지는 모두 내부로 숨기는 것이다. 캡슐화는 객체지향 프로그래밍의 개념 중 하나.

외부에 공개하는 것은 그것을 외부에서 사용해도 된다는 뜻이다.

그렇다면 어떤 것을 숨기고, 어떤 것을 노출해야 할까?

  1. 데이터를 숨겨라
  2. 기능을 숨겨라

 

정리

접근 제어자와 캡슐화를 통해 데이터를 안전하게 보호할 수 있고, 사용하는 개발자 입장에서 해당 기능을 사용하는 복잡도를 낮출 수 있다.

 

 

Reference

인프런 '김영한의 실전 자바 - 기본편'

프로그램이 커져 많은 클래스들이 산재해 있다면 보기에도 어렵고, 개발하기 불편할 것이다. 그래서 이를 체계적으로 정리하기 위한 패키지에 대해 공부했다. 컴퓨터에서 일반 폴더와 거의 같은 개념이다.

 

패키지

예를 들어 pack.a 패키지에 User라는 클래스가 있다고 하자. 해당 클래스를 사용하기 위해서는 다음과 같이 코드를 작성해야 한다.

pack.a.User user = new pack.a.User();

이 방식은 타이핑 하기도 어렵고, 오타가 발생할 가능성이 높다. 그래서 이를 import로 간단하게 할 수 있다.

  • import 사용
package pack;

import pack.a.User;

	public class PackageMain2 {
		public static void main(String[] args) {
			User user = new User(); //import 사용으로 패키지 명 생략 가능
	} 
}

 

패키지 규칙

  • 패키지의 이름과 위치는 폴더(디렉토리) 위치와 같아야 한다. (필수)
  • 패키지 이름은 모두 소문자를 사용한다. (관례)
  • 패키지 이름의 앞 부분에는 일반적으로 회사의 도메인 이름을 거꾸로 사용한다. 예를 들어,com.company.myapp 과 같이 사용한다. (관례)
    • 이 부분은 필수는 아니다. 하지만 수 많은 외부 라이브러리가 함께 사용되면 같은 패키지에 같은 클래스 이름이 존재할 수도 있다.
    • 이렇게 도메인 이름을 거꾸로 사용하면 이런 문제를 방지할 수 있다.
    • 내가 오픈소스나 라이브러리를 만들어서 외부에 제공한다면 꼭 지키는 것이 좋다.
    • 내가 만든 애플리케이션을 다른 곳에 공유하지 않고, 직접 배포한다면 보통 문제가 되지 않는다.

 

패키지와 계층 구조

일반적인 패키지 계층 구조는 다음과 같다.

  • a
    • b
    • c

여기서 주의해야할 점은 a 패키지 ≠ a.b 패키지 이고, a 패키지 ≠ a.c 패키지 라는 것이다. 우리가 보기에는 b, c 가 a의 하위에 있는 것처럼 보이지만, 실제로 다 다른 패키지이다. 따라서 a 패키지 따로 import, a.b 패키지 따로 import, a.c 패키지 따로 import 해야한다.

 

 

Reference

인프런 '김영한의 실전 자바 - 기본편'

만약 객체 생성 직후 객체를 초기화해야한다면, 생성자를 사용하면 된다.

 

생성자란?

객체 생성 직후 객체를 초기화 해야할 때 사용하는 메서드이다. 클래스명과 동일한 메서드명을 가지고 반환 타입이 없는 것 외에는 일반 메서드와 동일한 형태이다.

  • 생성자 예시
package construct;
public class MemberInit {
		String name;
    int age;
    int grade;

  //추가
	void initMember(String name, int age, int grade) {
			this.name = name;
			this.age = age;
			this.grade = grade;
  } 
}
  • this 키워드
    • 클래스를 가리키는 예약어
    • 위의 initMember()처럼 멤버 변수와 메서드의 매개변수 이름이 동일할 때 구분하기 위해서 사용
    • 참고로 메서드 입장에서는 매개변수가 멤버변수보다 더 우선순위를 가진다**(매개변수 > 멤버변수)**
    • 생략 가능하고, 없을 때 지역 변수 → 멤버 변수 순서로 찾는다
    • 구분을 꼭 해야하는 경우에만 선택적으로 사용하는 것이 권장된다

 

생성자 호출

생성자는 객체 생성후 ‘()’로 호출하면 된다. 보통 객체 생성과 생성자 호출을 동시에 한다.

new MemberConstruct("user1", 15, 90);
- new MemberConstruct : 객체 생성
- MemberConstruct(...) : 생성자 호출
  • 생성자 호출로 코드 제약을 걸 수 있다
    • 생성자를 실수로 호출하지 않는 경우 객체는 생성되었지만, 값이 초기화되지 않아 의미없는 정보를 가진 객체가 생성될 수 있고, 이는 에러의 가능성이 있다
    • 따라서 기본/직접 정의한 생성자를 강제로 호출하게 함으로써(호출하지 않을 시 컴파일 에러) 객체의 초기화를 강제해 유령 객체가 등장할 가능성을 원천 차단할 수 있다

생성자를 사용하면 필수값 입력을 보장할 수 있다!

 

기본 생성자

생성자가 하나도 없다면 자바에서 기본 생성자(클래스명())은 자동으로 만들어준다. 하지만, 사용자 정의 생성자가 하나라도 있다면 자바는 기본 생성자를 만들지 않는다.

 

 

Reference

인프런 '김영한의 실전 자바 - 기본편'

 

자바는 객체지향 프로그래밍 언어이다. 객체지향과 항상 비교하는 것이 절차지향인데 각각의 핵심은 무엇이고, 장단점으로 무엇이 있는지 공부했다.

 

절차지향 프로그래밍

  • 실행 순서를 중요하게 여김
  • “어떻게”를 중심으로 프로그래밍 할지 중점
  • 데이터와 관련 메서드 분리

 

객체지향 프로그래밍

  • 객체를 중요하게 여김
  • “무엇을” 중심으로 프로그래밍 할지 중점
  • 데이터와 관련 메서드 한 곳에 있음 = 캡슐화
    • 캡슐화의 이점
      • 객체지향 프로그래밍을 하면 하나의 객체의 상태와 행동을 필드와 메서드로 다 표현할 수 있고, 사람이 이해하기 더 쉬워진다. 따라서 코드 가독성이 증가하고, 속성과 기능이 한 곳에 있기 때문에 변경도 더 쉬워진다.

 

둘의 중요한 차이

절차지향 프로그래밍과 객체지향 프로그래밍의 가장 큰 차이점은 데이터와 메서드의 분리 여부이다. 절차 지향은 데이터와 해당 데이터 관련 메서드가 분리되어있다. 반면 객체 지향은 데이터와 해당 데이터 관련 메서드가 하나의 객체 안에 포함되어 있다.

절차 지향은 순서를 어떻게 설계할 지를 고민해야 했다면, 객체 지향은 객체를 어떻게 설계하지에 더 초점이 맞춰져있다고 이해하면 된다.

 

절차지향 ↔ 객체지향 ?

Nope. 절차 지향과 객체 지향은 서로 대치되는 개념이 아니다. 객체 지향이라도 프로그램의 작동 순서는 중요하다. 다만, 순서와 객체 둘 중 어디에 더 초점을 맞추는지가 차이점이다.

 

 

Reference

인프런 '김영한의 실전 자바 - 기본편'

'Dev Language > Java' 카테고리의 다른 글

[자바/기본] 5. 패키지  (0) 2024.01.04
[자바/기본] 4. 생성자  (0) 2024.01.04
[자바/기본] 2. 기본형과 참조형  (0) 2024.01.04
[자바/기본] 1. 클래스와 데이터  (4) 2024.01.04
[자바/입문] 8. 메서드  (2) 2023.12.29

+ Recent posts