BackEnd/Java

[Java] 김영한의 실전 자바 정리 2 - 패키지 ~ 메모리 구조와 static

kangminhyuk1111 2023. 12. 4. 16:07

패키지

컴퓨터는 보통 파일을 분류하기 위해 폴더, 디렉토리라는 개념을 제공한다. 자바도 이런 개념을 제공하는데, 이것이 바로 패키지 이다.
같은 패키지에 존재하면 경로를 생략해도된다
다른 위치의 패키지 라면, 전체 경로를 포함해서 클래스를 적어야 한다.
패키지 안에 있는 모든 클래스를 import하고 싶으면 *을 통해 추가한다.
클래스가 중복 되어도 패키지 이름으로 구분해서 사용할 수 있다.
import pack.a.User;
import pack.b.User;
이런식으로 같은 클래스명이 import되었을때
하나는 User로 사용이 가능하지만 두번째 부터는 pack.b.User 이런식으로 사용해야한다.

패키지의 규칙

이름과 위치는 폴더 위치와 같아야한다.
패키지 이름은 모두 소문자를 사용한다 (관례)
패키지 이름의 앞 부분에는 일반적으로 회사의 도메인 이름을 거꾸로 사용한다. com.company.myapp (관례)
수 많은 외부 라이브러리가 함께 사용되면 같은 패키지에 같은 클래스 이름이 존재할 수 있다.
이렇게 도메인 이름을 거꾸로 사용하면 이런 문제를 방지 할 수 있다.
오픈소스나 라이브러리를 만들어서 외부에 제공한다면, 꼭 지키는 것이 좋다.

접근 제어자 이해1

접근 제어자를 사용하면 해당 클래스 외부에서 특정 필드나 메서드에 접근하는 것을 허용하거나 제한할 수 있다.
객체를 생성하고 객체 내부에서 변수의 값을 100으로 막았을때, 근본적인 문제를 해결할 수 없다.
외부에서 변수의 값 = 200; 이라고 지정 했을때 이를 막을 방법이 없다
막기위해서는 접근제어자를 이용해 막을 수 있다.
private 으로 설정시 외부에서 접근하면 안됨. 컴파일 오류가 나는데 컴파일 오류는 좋은 오류
좋은 프로그램은 무한한 자유도가 주어지는 프로그램이 아니라 적절한 제약을 제공하는 프로그램이다.

접근 제어자 종류

자바는 총 4가지 접근 제어자가 존재한다
private - 모든 외부 호출을 막는다
default - 같은 패키지 안에서 호출 허용
protected - 같은 패키지 안에서 호출은 허용한다.
public - 모든 외부 호출을 허용한다.

접근 제어자 사용 - 클래스 레벨

클래스 레벨의 접근 제어자는 public, default 만 사용할 수 있다.
public 클래스는 파일명과 동일한 클래스명을 가진다.
하나의 자바 파일에 public 클래스는 하나만 존재할 수 있다.
하나의 자바 파일에 default 접근 제어자를 사용하는 클래스는 무한정 만들 수 있다.
default 클래스는 같은 패키지 내부에서만 접근할 수 있다.

캡슐화

객체지향 프로그래밍의 중요한 개념중 하나다. 캡슐화는 데이터와 해당 데이터를 처리하는
메서드를 하나로 어서 외부에서의 접근을 제한하는 것을 말한다.
캡슐화를 통해 데이터의 직접적인 변경을 방지하거나 제한 할 수 있다.

1.데이터를 숨겨라

객체에는 속성과 기능이 있다. 캡슐화에서 가장 필수로 숨겨야하는 것은 데이터 이다.
객체 내부의 데이터를 외부에서 함부로 접근하게 두면 클래스 안에서 데이터를 다루는
모든 로직을 무시하고 데이터를 변경하게 된다면 이는 위험할 뿐만 아니라, 캡슐화를 깨버린다.
객체의 데이터는 반드시 객체가 제공하는 기능인 메서드를 이용해서 접근해야한다.

2.기능을 숨겨라

가급적이면 필요한 기능만 보이도록 하라.
외부에서 사용하지 않고 내부에서만 사용하는 기능들이 있다, 이런 기능도 모두 감추는 것이 좋다.
자동차를 운전하기 위해 자동차가 제공하는 복잡한 엔진 조절 기능, 배기 기능까지 우리가 알 필요는 없다.
우리는 단지 엑셀과 핸들 정도의 기능만 알면 된다.
사용자에게 이러한 기능들을 알려줄 필요가 없기에 꼭 필요한 기능만 외부에 노출하자. 나머지 기능안 모두 내부로 ㄱㄱ

정리하면 데이터는 모두 숨기고 기능은 꼭 필요한 기능만 노출하는 것이 좋은 캡슐화이다.

자바 메모리 구조

자바 메모리 구조는 메서드, 스택, 힙 영역 3개로 나눌 수 있다.
매서드 영역은 클래스 정보를 보관한다. 이 클래스 정보가 붕어빵 틀이다.
스택영역은 실제 프로그램이 실행되는 영역이다. 메서드를 실행할 때 마다 하나씩 쌓인다.
힙 영역 객체가 생성되는 영역이다 new 명령어를 사용하면 이 영역을 사용한다. 인스턴스가 존재하는공간

메서드 영역은 실제 필요한 공통 데이터를 관리한다.
클래스 정보, static 변수 보관, 런타임 상수 풀

스택 영역은 자바 실행시 하나의 스택이 생성되고 각 스택 프레임은 지역변수, 중간연산결과, 메서드 호출 정보 등을 포함한다.

스택 프레임 : 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임이다.

힙 영역 : 객체와 배열이 생성되는 영역이다. 가비지 컬렉션이 이루어 지는 주요 영역이며, 더이상 참조되지 않는 객체는 GC에 의해 제거된다.

스택 영역은 더 정확히는 각 쓰레드 별로 하나의 실행 스택이 생성된다. 따라서 쓰레드 수 만큼 스택 영역이 생성된다.
지금은 쓰레드를 1개만 사용하므로 스택 영역도 하나이다. 쓰레드에 대한 부분은 멀티 쓰레드를 학습해야 이해할 수 있다.

자바 실행시 main 메서드에 스택프레임을 생성한다.
main 메서드 실행시 스택 형태 / 후입 선출 형태로 실행한다.

자바는 스택 영역을 사용해서 매서드 호출과 지역변수를 관리한다.

메서드를 계속 호출하면 스택 프레임이 계속 쌓인다.

지역변수는 스택 영역에서 관리한다.

스택 프레임이 종료되면 지역 변수도 함께 제거된다.

스택프레임이 모두 제거되면 프로그램도 종료된다.

반응형