ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 자바 basic 5 - 8 강 요약
    자바 2024. 11. 19. 11:22

    5. 패키지

    패키지 규칙

    1. 패키지의 이름과 위치는 폴더(디렉토리) 위치와 같아야 한다 (필수)

    2. 패키지 이름은 모두 소문자를 사용한다 (관례)

    3. 패키지 이름의 앞 부분에는 일반적으로 회사의 도메인 이름을 거꾸로 사용한다 (관례)

        - 이 부분은 필수는 아니다. 하지만 수많은 외부 라이브러리가 함께 사용되면 같은 패키지에 같은 클래스 이름이

           존재할 수도 있다 이렇게 도메인 이름을 거꾸로 사용하면 이런 문제를 방지할 수 있다

        - 내가 오픈소스나 라이브러리를 만들어서 외부에 제공한다면 꼭 지키는 것이 좋다

        - 내가 만든 애플리케이션을 다른 곳에 공유하지 않고, 직접 배포한다면 보통 문제가 되지 않는다

     

    패키지를 구성할 때 서로 관련된 클래스는 하나의 패키지에 모으고, 관련이 적은 클래스는 다른 패키지로 분리하는 것이 좋다

     

     

     

    6. 접근 제어자

    접근 제어자 (access modifier)

    자바는 public, private같은 접근 제어자(access modifier)를 제공한다

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

     

     

    접근 제어자 종류
    • private : 모든 외부 호출을 막는다
    • default(package-private) : 같은 패키지 안에서 호출은 허용한다
    • protected : 같은 패키지 안에서 호출을 허용하며 패키지가 달라도 상속 관계의 호출은 허용한다
    • public :  모든 외부 호출을 허용한다

    cf. 접근 제어자를 명시하지 않으면 같은 패키지 안에서 호출을 허용하는 default 접근 제어자가 적용된다

     

     

    접근 제어자의 핵심은 속성과 기능을 외부로부터 숨기는 것
    • private은 나의 클래스 안으로 속성과 기능을 숨길 때 사용, 외부 클래스에서 해당 기능을 호출할 수 없다
    • default는 나의 패키지 안으로 속성과 기능을 숨길 때 사용, 외부 패키지에서 해당 기능을 호출할 수 없다
    • protected는 상속 관계로 속성과 기능을 숨길 때 사용, 상속 관계가 아닌 곳에서 해당 기능을 호출할 수 없다
    • public은 기능을 숨기지 않고 어디서든 호출할 수 있게 공개한다

     

     

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

     

    클래스 레벨의 접근 제어자 규칙

    1. 클래스 레벨의 접근 제어자는 public, default 만 사용할 수 있다 ( private, protected 는 사용할 수 없다 )

    2. public 클래스는 반드시 파일명과 이름이 같아야 한다

        > 하나의 자바 파일에 public 클래스는 하나만 등장할 수 있다

        >  하나의 자바 파일에 default 접근 제어자를 사용하는 클래스는 무한정 만들 수 있다

     

     

    캡슐화

     

    1. 데이터를 숨겨라

    객체에는 속성(데이터)과 기능(메서드)이 있다

    캡슐화에서 가장 필수로 숨겨야 하는 것은 속성(데이터)이다

    객체 내부의 데이터를 외부에서 함부로 접근하게 두면, 클래스 안에서 데이터를 다루는 모든 로직을 무시하고 데이터를 변경할 수 있다

    객체의 데이터는 객체가 제공하는 기능인 메서드를 통해서 접근해야 한다

    2. 기능을 숨겨라

    객체의 기능 중에서 외부에서 사용하지 않고 내부에서만 사용하는 기능들이 있다

    이런 기능도 모두 감추는 것이 좋다

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

     

     

     

    7. 자바 메모리 구조와 static

    자바 메모리 구조

     

    • 메서드 영역(Method Area) : 메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다 이 영역은 프로그램의 모든 영역에서 공유한다

          - 클래스 정보 : 클래스의 실행 코드(바이트 코드), 필드, 메서드와 생성자 코드 등 모든 실행 코드가 존재한다

          - static 영역 : static변수들을 보관한다

          -  런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다

             예를 들어서 프로그램에 "hello" 라는 리터럴 문자가 있으면 이런 문자를 공통으로 묶어서 관리한다

              이 외에도 프로그램을 효율 적으로 관리하기 위한 상수들을 관리한다.

    • 스택 영역(Stack Area) : 자바 실행 시, 하나의 실행 스택이 생성된다 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다
    • 힙 영역(Heap Area) : 객체(인스턴스)와 배열이 생성되는 영역이다 가비지 컬렉션(GC)이 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거된다

     

     

    스택과 큐 자료 구조

    스택 / 후입 선출(LIFO, Last In First Out) : 나중에 넣은 것이 가장 먼저 나오는 자료구조

    큐 / 선입 선출(FIFO, First In First Out) : 먼저 넣은 것이 가장 먼저 나오는 자료구조

     

     

    호출
    종료

    자바는 스택 영역을 사용해서 메서드 호출과 지역 변수(매개변수 포함)를 관리한다

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

    지역 변수(매개변수 포함)는 스택 영역에서 관리한다

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

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

     

     

    static 변수

     

    static키워드를 사용하면 공용으로 함께 사용하는 변수를 만들 수 있다

    public class Data3 {
        public String name;
        // static
        public static int count;
        
        public Data3(String name) {
            this.name = name;
            count++;
        }
    }
    public class DataCountMain3 {
        public static void main(String[] args) {
            Data3 data1 = new Data3("A");
            System.out.println("A count=" + Data3.count);
    
            Data3 data2 = new Data3("B");
            System.out.println("B count=" + Data3.count);
            
            Data3 data3 = new Data3("C");
            System.out.println("C count=" + Data3.count);
        }
    }
    
    // 실행결과
    // A count=1
    // B count=2
    // C count=3

     

     

     

    멤버 변수(필드)의 종류
    public class Data3 {
        // 인스턴스 변수
        public String name;
        // 클래스 변수
        public static int count;
    }
    • 인스턴스 변수 : static이 붙지 않은 멤버 변수 (예) name)

           - static이 붙지 않은 멤버 변수는 인스턴스를 생성해야 사용할 수 있고, 인스턴스에 소속되어 있다

           - 인스턴스 변수는 인스턴스를 만들 때 마다 새로 만들어진다

    • 클래스 변수 : static이 붙은 멤버 변수 (예) count)

           -  클래스 변수, 정적 변수, static변수등으로 부른다

           -  static이 붙은 멤버 변수는 인스턴스와 무관하게 클래스에 바로 접근해서 사용할 수 있고,

              클래스 자체에 소속되어 있다

           -  클래스 변수는 자바 프로그램을 시작할 때 딱 1개가 만들어진다

               인스턴스와는 다르게 보통 여러 곳에서 공유하는 목적으로 사용된다

     

     

    변수와 생명주기

     

    - 지역 변수(매개변수 포함) : 지역 변수는 스택 영역에 있는 스택 프레임 안에 보관된다 메서드가 종료되면 스택 프레임도 제거되는데 이때 해당 스택 프레임에 포함된 지역 변수도 함께 제거된다 따라서 지역 변수는 생존 주기가 짧다

    - 인스턴스 변수 : 인스턴스에 있는 멤버 변수를 인스턴스 변수라 한다 인스턴스 변수는 힙 영역을 사용한다 힙 영역은 GC(가비지 컬렉션)가 발생하기 전까지는 생존하기 때문에 보통 지역 변수보다 생존 주기가 길다

    - 클래스 변수 : 클래스 변수는 메서드 영역의 static 영역에 보관되는 변수이다 메서드 영역은 프로그램 전체에서 사용하는 공용 공간이다 클래스 변수는 해당 클래스가 JVM에 로딩되는 순간 생성된다 그리고 JVM이 종료될 때까지 생명주기가 이어진다 따라서 가장 긴 생명주기를 가진다

     

    > static이 정적이라는 이유

       힙 영역에 생성되는 인스턴스 변수는 동적으로 생성되고, 제거된다

       반면에 static 인 정적 변수는 거의 프로그램 실행 시점에 딱 만들어지고, 프로그램 종료 시점에 제거된다

       정적 변수는 이름 그대로 정적이다

     

     

    정적 변수 접근법

     

    //클래스를 통합 접근
    System.out.println(Data3.count);

    클래스를 통한 접근 ( Data3.count )

    정적 변수는 클래스에서 공용으로 관리하기 때문에 클래스를 통해서 접근하는 것이 더 명확하다

    따라서 정적 변수에 접근할 때는 클래스를 통해서 접근하자

     

     

    static 메서드
    public class DecoUtil2 {
        public static String deco(String str) {
            String result = "*" + str + "*";
            return result;
        }
    }
    public class DecoMain2 {
        public static void main(String[] args) {
            String s = "hello java";
            String deco = DecoUtil2.deco(s);
            System.out.println("before: " + s);
            System.out.println("after: " + deco);
        }
    }

    static이 붙은 정적 메서드는 객체 생성 없이 클래스명 + . (dot) + 메서드명으로 바로 호출할 수 있다

     

     

    정적 메서드 사용법
    • static메서드는 static만 사용할 수 있다

            - 클래스 내부의 기능을 사용할 때, 정적 메서드는 static이 붙은 정적 메서드나 정적 변수만 사용할 수 있다

            -  클래스 내부의 기능을 사용할 때, 정적 메서드는 인스턴스 변수나, 인스턴스 메서드를 사용할 수 없다

    • 반대로 모든 곳에서 static을 호출할 수 있다

            -   정적 메서드는 공용 기능이며 접근 제어자만 허락한다면 클래스를 통해 모든 곳에서 static을 호출할 수 있다

     

    > 정적 메서드가 인스턴스의 기능을 사용할 수 없는 이유

    정적 메서드는 클래스의 이름을 통해 바로 호출할 수 있다 그래서 인스턴스처럼 참조값의 개념이 없다

    특정 인스턴스의 기능을 사용하려면 참조값을 알아야 하는데, 정적 메서드는 참조값 없이 호출한다

    따라서 정적 메서드 내부에서 인스턴스 변수나 인스턴스 메서드를 사용할 수 없다

     

     

    정적 메서드 활용

    정적 메서드는 객체 생성이 필요 없이 메서드의 호출만으로 필요한 기능을 수행할 때 주로 사용한다

    예를 들어 간단한 메서드 하나로 끝나는 유틸리티성 메서드에 자주 사용한다

     

     

    정적 메서드 접근법

     

    / /인스턴스를 통한 접근
    DecoData data3 = new DecoData();
    data3.staticCall();
    
    // 클래스를 통한 접근
    DecoData.staticCall();

    static메서드는 static변수와 마찬가지로 클래스를 통해 바로 접근할 수 있고, 인스턴스를 통해서도 접근할 수 있다

    정적 메서드는 클래스에서 공용으로 관리하기 때문에 클래스를 통해서 접근하는 것이 더 명확하다

     

     

    main() 메서드는 정적 메서드

     

    인스턴스 생성 없이 실행하는 가장 대표적인 메서드가 바로 main() 메서드이다

    메서드는 프로그램을 시작하는 시작점이 되는데, 생각해 보면 객체를 생성하지 않아도  main() 메서드가 작동했다

    이것은 main() 메서드가 static이기 때문이다

     

     

     

    8. final

    final 변수와 상수

    변수에 final 키워드가 붙으면 더는 값을 변경할 수 없다

     

     

    상수(Constant)

    상수는 변하지 않고, 항상 일정한 값을 갖는 수를 말한다

    자바에서는 보통 단 하나만 존재하는 변하지 않는 고정된 값을 상수라 한다

    이런 이유로 상수는 static final 키워드를 사용한다

     

     

    자바 상수 특징

     

    - static final 키워드를 사용한다

    - 대문자를 사용하고 구분은 _(언더스코어)로 한다. (관례)

    - 필드를 직접 접근해서 사용한다

     

     

     

     

     


    김영한의 실전자바 - 기본편 (5강 - 8강)

    728x90

    '자바' 카테고리의 다른 글

    [JAVA] 자바 mid1 1 - 3 강 요약  (0) 2024.11.21
    [JAVA] 자바 basic 9 - 12 강 요약  (3) 2024.11.20
    [JAVA] 자바 basic 1 - 4 강 요약  (0) 2024.11.19
    [JAVA] 커스텀 어노테이션 @interface  (0) 2024.11.14
    [JAVA] Class 클래스  (1) 2024.11.14
Designed by Tistory.