TIL 2022-09-23 정적멤버 / static

JYR00·2022년 9월 23일
0

TIL

목록 보기
14/60
post-thumbnail

정적멤버

  • 클래스에 고정된 필드와 메소드 - 정적필드(정적 멤버 변수), 정적 메소드(정적 멤버 메소드)

  • 멤버의 사용 조건 : 클래스를 기반으로 객체를 생성 후 사용 // 클래스는 설계도. 설계도만으로는 부족. 객체 생성 후 사용해야

  • 정적 멤버는 클래스에 소속된 멤버

    • 객체 내부에 존재하지 않고, 메소드 영역에 존재
    • 정적 멤버는 객체를 생성하지 않고 클래스로 바로 접근해 사용

클래스.필드;
클래스.메소드(매개값, ...);

클래스 이름과 함께 도트(.) 연산자로 접근
static은 클래스의 멤버다. 그렇기에 객체없이 클래스 이름으로 접근가능!
그렇지만 정적 멤버는 일반 객체 멤버를 사용 불가.

=> 정적 멤버는 정적 멤버끼리만 사용(차이)

일반 멤버는 둘 다 사용 가능.

인스턴스 멤버 선언 vs 정적 멤버 선언의 기준

  • 필드

    • 객체마다 가지고 있어야 할 데이터가 다를 경우 => 인스턴스 필드(멤버 변수)
    • 공용적인 데이터 -> 정적 필드
  • 메소드

    • 인스턴스 필드로 작업해야 할 메소드 -> 인스턴스 메소드
    • 인스턴스 필드로 작업하지 않는 메소드 ->정적 메소드

    일단 만들 때는 일반 멤버로 만들고 공용으로 사용해야 할 것 같은 건 정적 멤버로 바꿔주자!

    정적 멤버와 static

    • 정적 초기화 블록(정적 멤버 전용 생성자)

      • 클래스가 메소드 영역으로 로딩될 때 자동으로 실행되는 블록

      • 정적 필드의 복잡한 초기화 작업과 정적 메소드 호출 가능

      • 클래스 내부에 여러 개가 선언되면 선언된 순서대로 실행

정적 메소드/블록 작성시 주의점

  • 객체가 없어도 실행 가능
  • 블록 내부에 인스턴스 필드나 인스턴스 메소드 사용불가
  • 객체 자신의 참조인 this 사용 불가

싱글톤(singleton) (디자인패턴 중 하나임..)

  • 하나의 애플리케이션 내에서 단 하나의 객체만 생성한다.

  • 외부에서 new 연산자로 생성자를 호출할 수 없도록 막기

    • private 접근 제한자를 생성자 앞에 붙임
  • 클래스 자신의 타입으로 정적 필드 선언

    • 자신의 객체를 생성해 초기화
    • private 접근 제한자 붙여 외부에서 필드 값 변경
  • 외부에서 호출할 수 있는 정적 메소드인 getInstance()선언

    • 정적 필드에서 참고하고 있는 자신의 객체 리턴

    파이널

  • 최종적인 값을 갖고 있는 필으 = 값을 변경할 수 없는 필드

  • FINAL 필드의 딱 한번의 초기값 지정 방법

    • 앞에 final을 붙여주면 된다.

    안 붙어 있는 것은 여러 번 수정 가능하다.

    Static final(상수)

    상수(static final)

  • 상수 = 정적 파이널 필드

    -final 필드 : 객체 마다 가지는 불변의 인스턴스 필드

  • 상수:

    • 객체마다 가지고 있지 않음
    • 메소드 영역에서 클래스 별로 관리되는 불면의 정적 필드
    • 공용 데이터로서 사용
  • 상수 이름은 전부 대문자로 작성

접근 제한자 (p.167)

  • 클래스 및 클래스의 구성 멤버에 대한 접근을 제한하는 역할
    • 다른 패키지에서 클래스를 사용하지 못하도록(클래스 제한) (캡슐화)
    • 클래스로부터 객체를 생성하지 못하도록(생성자 제한)
    • 특정 필드와 메소드를 숨김 처리(필드와 메소드 제한)

접근 제한자 종류 4가지

public(전체 허용)
< protected(다른 패키지에서 접근불가 자식 클래스에서는 접근 가능)
< default(패키지가 다르면 실행 불가. 다른 패키지에서 접근 불가)
< private(외부에서 접근 불가. 자신만 사용가능. 클래스 밖에서 접근불가.)

클래스의 접근 제한

  • default -> 접근 제한자를 생략하면 자동으로 default로 인식된다

    • 클래스 선언할 때 public 생략한 경우

    +public
    -다른 개발자가 사용할 수 있도록 라이브러리로 만들 때 유용

패키지

  • 클래스를 기능별로 묶어 그룹이름으 붙여 놓은 것

  • 클래스 이름이 겹칠 수 있다. 그렇기 때문에 a 패키지, b 패키지 안의 클래스 이렇게 구별을 할 수 있다. 효율적으로 관리

    • teamA.calc.Java
    • teamB.calc.Java

System.out.println => System.out이거 패키지다.

import

  • 미리 만들어온 패키지를 사용할 수 있도록 끌어요는 것.

  • import Java.util.Scanner; 자바밑에 유틸이라는 클래스안에 스캐너를 내가 쓰는 클래스에 넣겠다.

  • 기존에 존재하는 패키지 및 클래스를 현재 파일에서 사용하게 해주는 명령어.

  • import + 클래스명

Getter /Setter

  • 클래스 선언할 때 필드는 일반적으로 private 접근 제한 (외부에서 접근 불가)
  • 읽기 전용 필드가 있을 수 있음(getter 필요성)
  • 외부에서 엉뚱한 값으로 변경할 수 없도록 (setter의 필요성)

Getter

  • private 필드(멤버변수)의 값을 리턴 하는 역할 - 필요할 경우 필드 값 가공
  • getFieldName()

Setter

  • 외부에서 주어진 값을 필드 값으로 수정

  • 멤버변수에 저장할 때

  • 필요할 경우 외부의 값을 유효성검사

  • setFieldName(타입변수)메소드

  • 메개 변수 타입은 필드의 타입과 동일

    어노테이션

  • 프로그램에게 추가적인 정보를 제공하는 메타데이터 (JSP/SPRING에서 많이 사용됨)

  • 컴파일러에게 코드 작성 문법 에러 체크하도록 정보제공

  • 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동 생성하게 정보 제공

  • 상속 : 부모에게 상속받은 메서드 수정해서 사용시

0개의 댓글