JAVA - 07

월요일좋아·2022년 9월 23일
0

JAVA

목록 보기
7/12

정적 멤버와 static

정적(static) 멤버란?

  • 클래스에 고정된 필드(=변수)와 메소드 - 정적 필드(=정적 멤버 변수), 정적 메소드(=정적 멤버 메소드)
  • 정적 멤버는 클래스에 소속된 멤버
    • 객체 내부에 존재하지 않고, 메소드 영역에 존재
    • 정적 멤버는 객체를 생성하지 않고 클래스로 바로 접근해 사용
  • static : 클래스의 멤버. 객체 없이 클래스 이름으로 접근. 정적 멤버는 일반 객체 멤버 접근 불가
    정적 멤버는 정적 멤버만 사용

정적 멤버 선언

  • 필드 또는 메소드 선언할 때 static 키워드 붙이면 끝!
  • 예시

StaticMember

public class StaticMember {
    public static void main(String[] args) {
//        객체 생성 후 객체의 멤버를 사용
        StaticClass sc1 = new StaticClass();
        sc1.getInfo();
        System.out.println("나이 : " + sc1.age);
        System.out.println("이름 : " + sc1.name);

//        StaticClass.name = "유인나"    <<--- 바로 접근 불가능!, 이것을 가능하게 해주는 것이 static.

        StaticClass.job = "가수"; // <--- 이건 되는 이유?(static)
        System.out.println("static 직업 : " + StaticClass.job);
        StaticClass.getJob();
    }
}

StaticClass

public class StaticClass {
    public String name;
    public int age;

    public static String job;


    public StaticClass() {
        this("아이유");
    }
    public StaticClass(String name) {
        this(name, 30);
    }
    public StaticClass(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void setInfo() {
        this.name = name;
        this.age = age;
    }

    public static void getJob(){
        System.out.println("static 직업 : " + job);
    }

    public void getInfo() {
        System.out.println("이름 : " + this.name + "\n나이 : " + this.age);
    }

}

정적 멤버 사용

  • 클래스 이름과 함께 도트(.)연산자로 접근
    클래스.필드;
    클래스.메소드(매개값...);
[Calc 클래스 생성]
public class Calc {

    public static int abs(int a) {
        if (a > 0) {
            return a;
        }
        else {
            return -a;
        }
    }

    public static int max(int a, int b) {
        if (a > b) {
            return a;
        }
        else {
            return b;
        }
    }

    public static int min(int a, int b) {
        if (a > b) {
            return b;
        }
        else {
            return a;
        }
    }
}
[Calc 테스트]
        System.out.println(Calc.abs(-5));
        System.out.println(Calc.max(10, 8));
        System.out.println(Calc.min(-3, -4));
        
//        객체를 생성해서 접근 해도 접근 자체는 가능함
        Calc c = new Calc();
        System.out.println(c.abs(-5));
        System.out.println(c.max(10, 8));
        System.out.println(c.min(10, 8));

Calc 클래스의 멤버 메서드인 abs, max, min 이 모두 정적 멤버이기 때문에 객체 생성 없이 클래스 이름으로 직접 접근이 가능함

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

  • 필드(멤버 변수)
    • 객체마다 가지고 있어야 할 데이터 -> 인스턴스 필드
    • 공용적인 데이터 -> 정적 필드
   public class calculator {
   	String color;		// 계산기 별로 색깔이 다를 수 있다.
    static double pi = 3.14159;		// 계산기에서 사용하는 파이(pi)값은 동일히다.
  • 메소드

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

    • 클래스가 메소드 영역으로 로딩될 때 자동으로 실행하는 블록
	static {			// 정적 멤버 전용 생성자
		...
	}
  • 정적 필드의 복잡한 초기화 작업과 정적 메소드 호출 가능
  • 클래스 내부에 여러개 가 선언되면 선언된 순서대로 실행

정적 메소드와 정적 블록 작성 시 주의할 정

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

싱글톤(Singleton)

  • 하나의 애플리케이션 내에서 단 하나만 생성되는 객체

싱글톤을 만드는 방법

  • 외부에서 new 연산자로 생성자를 호출할 수 없도록 막기
    • private 접근 제한자를 생성자 앞에 붙임

  • 클래스 자신의 타입으로 정적 필드 선언
    • 자신의 객체를 생성해 초기화
    • prvate 접근 제한자 붙여 외부에서 필드 값 변경 불가하도록

  • 외부에서 호출할 수 있는 정적 메소드인 getInstance() 선언
    • 정적 필드에서 참조하고 있는 자신의 객체 리턴
public class Singleton {
//    private 접근제한자 : private로 지정된 멤버는 해당 클래스 내에서만 사용이 가능함.
    private static Singleton singleton = new Singleton();

//    생성자의 접근제한자에 private를 사용하면 객체 생성 시 new 키워드를 사용할 수 없음.
//	 									( = 메모리에 등록이 안됨 = 객체로 만들수 없음)
//    객체 생성이 불가능
    private Singleton() { }

//    객체로 만들지못하니까 클래스타입으로 접근
    public static Singleton getInstance() {
        return singleton;
    }
}

final 필드와 상수(static final)

final 필드

  • 최종적인 값을 갖고 있는 필드 = 값을 변경할 수 없는 필드
  • final 필드의 딱 한번의 초기값 지정 방법
    • 필드 선언 시
    • 생성자
public class Person {

//    final : 단 한번만 데이터의 저장이 가능하고 더 이상 수정이 불가능
    final String nation = "대한민국";
    final String ssn;
    String name;

//    final 변수인 ssn을 생성자를 통해서 한 번만 데이터 저장.
    public Person(String ssn, String name) {
        this.ssn = ssn;
        this.name = name;
    }
}
public class PersonEx {
    public static void main(String[] args) {
//        final 변수인 ssn에 생성자를 사용하여 데이터를 초기화
//        일반 멤버 변수인 name에 생성자를 사용하여 데이터를 초기화
        Person p1 = new Person("123456-1234567", "홍길동");

        System.out.println(p1.nation);
        System.out.println(p1.name);
        System.out.println(p1.ssn);

//        final 키워드가 사용된 멤버 변수인 nation과 ssn은 더 이상 수정이 불가능
//        p1.nation = "미국";
//        p1.ssn = "987654-9876543";
//        일반 멤버 변수인 name은 언제든지 수정이 가능함
        p1.name = "hong gil dong";

        System.out.println(p1.name);

    }
}

상수(static final)

  • 상수 = 정적 final 필드
    • final 필드:
      • 객체마다 가지는 불변의 인스턴스 필드
    • 상수(static final):
      • 객체마다 가지고 있지 않음
      • 메소드 영역에 클래스 별로 따로 관리되는 불변의 정적 필드
      • 공용 데이터로서 사용

  • 상수 이름은 전부 대문자로 작성

  • 다른 단어가 결합되면 _ 로 연결

접근 제한자

접근 제한자(Access Modifier)

  • 클래스 및 클래스의 구성 멤버에 대한 접근을 제한하는 역할
    • 다른 패키지에서 클래스를 사용하지 못하도록 (클래스 제한)
    • 클래스로부터 객체를 생성하지 못하도록 (생성자 제한)
    • 특정 필드와 메소드를 숨김 처리 (필드와 메소드 제한)
  • 접근 제한자의 종류
    private < default < protected < public
    • public : 전체 허용
    • protected : 다른 패키지에서 접근 불가 (but 자식클래스에서는 접근 가능)
    • default : 다른 패키지에서 접근 불가 (all)
    • private : 클래스 밖에서 접근 불가(자기자신만 사용 가능)

클래스의 접근 제한

  • default
    • 클래스 선언할 때 public 생략한 경우 자동으로 default로 인식
    • 다른 패키지에서는 사용 불가
  • public
    • 전체 사용
    • 다른 개발자가 사용할 수 있도록 라이브러리 클래스로 만들 때 유용

패키지

패키지란?

  • 클래스를 기능별로 묶어서 그룹 이름을 붙여 놓은것
    • 파일들을 관리하기 위해 사용하는 폴더(디렉토리)와 비슷한 개념
    • 패키지의 물리적인 현태는 파일 시스템의 폴더
  • 클래스 이름의 일부
    • 클래스를 유일하게 만들어주는 식별자
    • 전체 클래스 이름 = 상위패키지.하위패키지.클래스
    • 클래스명이 같아도 패키지명이 다르면 다른 클래스로 취급

import문

  • 패키지 내에 같이 포함된 클래스간 클래스 이름으로 사용 가능
  • 기존에 존재하는 패키지 및 클래스를 현재 파일에서 사용하는 것
  • 단축기 : Ctrl + Shift + O
  • 패키지가 다른 클래스를 사용해야 할 경우
    • 패키지 명 포함된 전체 클래스 이름으로 사용
	pakage com.mycompany;
    
    public class Car {
    	com.hankook.Tire tire = new com.hankook.Tire();
        }
  • import문으로 패키지를 지정하고 사용

Getter와 Setter

클래스 선언할 때 필드는 일반적으로 private 접근 제한

  • 읽기 전용 필드가 있을 수 있음 (Getter의 필요성)
  • 외부에서 엉뚱한 값으로 변경할 수 없도록 (Setter의 필요성)

Getter

  • private 필드의 값을 리턴하는 역할 - 필요할 경우 필드 값 가공
  • getFieldName() 또는 isFieldName() 메소드
    • 필드 타입이 boolean일 경우 isFieldName()

Setter

  • 외부에서 주어진 값을 필드 값으로 수정
    • 필요할 경우 외부의 값을 유효성 검사
    • setFieldName(타입 변수) 메메소드
    • 매개변수 타입은 필드의 타입과 동일

어노테이션

  • 프로그램에게 추가적인 정보를 제공해주는 메타데이터
  • 어노테이션 용도
    • 컴파일러에게 코드 작성 문법 에러 체크하도록 정보 제공
    • 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동 생성하게 정보 제공
    • 실행 시(런타임시) 특정 기능 실행하도록 정보 제공

어노테이션 타입 정의와 적용

  • 어노테이션 타입 정의

    • 소스파일 생성 : AnnotationName.java
    • 소스파일 내용
      public @inteface AnnptationName {
      }
  • 어노테이션 타입 적용
    ?

    기본 엘리먼트 value

  • 어노테이션 적용할 때 엘리먼트 이름 생략 가능
    ? - 예시

  • 두 개 이상의 속성을 기술할 때에는 value=값 형태로 기술

    어노테이션 적용 대상

    ?

0개의 댓글