[Java] 접근제한자와 객체배열관리

young-gue Park·2023년 7월 20일
0

Java

목록 보기
4/11
post-thumbnail

⚡접근제한자와 객체배열관리


📌JVM 메모리구조

🔷 Java 언어는 메모리 관리를 개발자가 하지 않는다.

  • GC(Garbage Collection)가 메모리 관리

    • Heap 영역(class 영역 포함)에 생성된 메모리 관리 담당
    • 더 이상 사용되지 않는 객체들을 점검하여 제거
  • Class Loader: *.class 파일을 메모리로 읽어온다.

  • 클래스 영역(메소드 영역): 클래스의 정보(설계도)를 저장하는 영역

  • : 인스턴스가 생성되는 공간

  • 스택: 메서드 수행시 프레임이 할당되며 필요한 변수나 중간 결과 값을 임시 기억하는 곳
    (메서드 종료 시 할당 메모리 자동제거)

⭐ 객체 생성과 메모리 할당

  • 객체 생성에 사용되는 클래스(클래스 변수 및 메서드 포함)는 클래스 영역에 저장되어있다.
  • 생성자를 통해 객체를 생성하면 초기화 된 인스턴스 변수를 포함한 인스턴스가 힙 영역에 저장된다.
  • 힙 영역에 저장된 인스턴스의 주소는 스택에 저장된다.

⭐ static

  1. 로딩 시점
  • static: 클래스 로딩 시
  • non-static: 객체 생성 시
  1. 메모리 상의 차이
  • static: 클래스 당 하나의 메모리 공간만 할당
  • non-static: 인스턴스 당 메모리가 별도로 할당
  1. 문법적 특징
  • static: 클래스 이름으로 접근
  • non-static: 객체 생성 후 접근

❗ 인스턴스명을 통한 접근이 아닌 클래스 이름을 통한 접근을 권장한다.

  • 클래스에서 static으로 선언한 변수는 다른 인스턴스에서 값을 변환 시 클래스 및 해당 클래스로 생성한 모든 인스턴스에서 동시다발적인 변환이 이루어진다.
  1. static 영역에서는 non-static 영역을 직접 접근이 불가능
  • 미리 메모리가 올라가 있는 static 영역에서는 인스턴스가 만들어져야 접근이 가능한 non-static 영역에 직접 접근할 수가 없는 것.
  1. 반대로 non-static 영역에서는 static 영역에 대한 접근이 가능

📌 접근 제한자

⭐ 패키지(package)

🔷 클래스와 관련 있는 인터페이스들을 모아두기 위한 이름 공간

  • PC의 많은 파일을 관리하기 위해 폴더를 이용하듯이 프로그램의 많은 클래스를 관리하기 위해서 패키지를 이용한다.
  • 패키지의 구분은 .(dot)연산자를 이용한다.
  • 패키지의 이름은 시중에 나와 있는 패키지들과 구분되게 지어야 한다.
  • 일반적으로 소속이나 회사의 도메인을 사용한다.
  • ex) 도메인을 뒤집어서 io.velog.project_이름.module_이름

⭐ 임포트(import)

  • 다른 패키지에 있는 클래스를 사용하기 위해서는 import 과정이 필요하다.
  • import를 선언 할 때는 import 키워드 뒤에 package 이름과 클래스 이름을 모두 입력하거나, 해당 패키지의 모든 클래스를 포함할 때는 '*'를 사용하기도 한다.

❗ * 의 하위 패키지는 다른 공간의 것들이라 가져올 수 없음

  • 내부적으로 같은 이름의 클래스이지만 패키지는 다른 클래스를 사용하는 방법
    • 풀패키지명으로 자료형 적기
      ex)
      pkg1.Person p1 = new pkg.Person();
      pkg1.pkg2.pkg3.Person p3 = new pkg1.pkg2.pkg3.Person();

⭐ 캡슐화

🔷 객체의 속성(data field)과 행위(메서드)를 하나로 묶고 실제 구현 내용 일부를 외부에 감추어 은닉한다.

⭐ 접근 제한자

🔷 클래스, 멤버 변수, 멤버 메서드 등의 선언부에서 접근 허용 범위를 지정하는 역할의 키워드이다.

  • 접근 제한자의 종류
    • public: 모든 위치에서 접근이 가능
    • protected: 같은 패키지에서 접근이 가능, 다른 패키지 접근 불가능
    • default: 같은 패키지에서만 접근이 허용, 접근제한자가 선언이 안 되었을 경우 기본 적용
    • private: 자신 클래스에서만 접근이 허용
    • 클래스(외부) 사용 가능: public, default
    • 4가지 모두 내부클래스, 멤버변수, 메소드 사용 가능

🌟 protecteddefault의 차이
protecteddefault와 다르게 다른 패키지에서 기존 클래스를 상속한 경우에 한하여 접근할 수 있다.
default로 생성된 클래스는 다른 패키지에서 절대 접근이 불가.

  • 그 외 제한자
    • static: 클래스 레벨의 요소 설정
    • final: 요소를 더 이상 수정할 수 없게 함
    • abstract

    ⭐ 접근자(getter) / 설정자(setter)

  • 클래스에서 선언된 변수 중 접근 제한에 의해 접근할 수 없는 변수의 경우 다른 클래스에서 접근할 수 없기 때문에, 접근하기 위한 메서드(설정자와 접근자)를 public으로 선언하여 사용
public class Person {
	private String name;
    private int age;
    
    public String getName() {
    	return name;
    }
    
    public void setName(String name) {
    	this.name = name;
    }
    
    public int getAge() {
    	return age;
    }
    
    public void setAge(int age) {
    	this.age = age;
    }
}

❗ boolean 타입의 접근자는 'is멤버변수명', 나머진 'get멤버변수명'이 국룰!


📌 객체 배열 관리

⭐ 싱글턴 패턴(Singleton pattern)

  • 소프트웨어 디자인 패턴에서 싱글턴 패턴을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
  • 외부에서의 생성이 차단된다.
	public class Manager {
    	private static Manager manager;
        
        private Manager() {}
        
        public static Manager getManager() {
        	if(manager = null)
            	manager = new Manager();
        	return manager;
        }
    }

⭐ 객체 배열 관리

  • 정보 관리 시스템
  • 캡슐화를 이용하여 클래스 작성
  • DB 대신 배열을 사용해 객체의 정보를 저장
  • 객체의 조회, 추가, 수정, 삭제(CRUD)를 구현
  • 싱글턴 패턴을 사용하여 정보 관리 일원화
profile
Hodie mihi, Cras tibi

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

너무 좋은 글이네요. 공유해주셔서 감사합니다.

답글 달기