[JAVA] static, final, interface

김채원·2025년 2월 25일
0
post-thumbnail

1.static

a. static이란 ?

모든 객체가 함께 사용하는 변수나 메서드를 만들때 사용
객체를 만들지 않아도 클래스 이름만으로 바로 사용가능
모든 객체가 같은 값을 공유
static 변수와 메서드는 한 번만 생성되고 Method Area(메서드영역) 에 저장

  • static 활용
class Person {
		// static 변수
		static int population = 0; 
		
		// static 메서드
		static void printPopulation() { 
				System.out.println("현재 인구 수: " + population);
		}
}
stem.out.println("static 변수: " + Person.population);
System.out.println("static 메서드: " + Person.printPopulation);

객체생성 없이 사용가능

static 키워드는 변수, 메서드에 붙여서 사용
static 키워드로 선언된 변수와 메서드는 MethodArea에 저장
각 객체(인스턴스)는 클래스영역에 저장된 데이터를 활용할 수 있음

b. 인스턴스 멤버 (인스턴스 변수 + 인스턴스 메서드)

객체를 만들때마다 생성되는 변수와 메서드
객체를 생성한 후에만 사용가능하고 각 객체가 개별값 가짐
인스턴스 변수와 메서드는 heap영역에 위치

class Person {
		String name;
		
		void printName() { // 인스턴스 메서드
				System.out.println("나의 이름은 " + this.name + "입니다.");
		}
}
public class Main {
    public static void main(String[] args) {
        
        Person p1 = new Person(); 
        p1.name = "gygim";
        p1.printName(); // p1 객체의 메서드 실행
        
        Person p2 = new Person();
        p2.name = "Steve";
        p2.printName(); // p2 객체의 메서드 실행
    }
}

c. 클래스 변수 & 메서드

앞에 static이 붙고 객체를 생성하지 않고도 바로 활용 가능
하나의 공간을 같이 쓰기 때문에 하나에서 증가하면 값이 증가

class Person {
		static int population = 0; // 클래스 변수
}
public class Main {
    public static void main(String[] args) {
        
        // 객체 생성 전에도 클래스 레벨에서 직접 접근가능
        System.out.println("현재 인구 수: " + Person.population);
        
        Person p1 = new Person();
        Person p2 = new Person();
        
        // 모든 객체가 하나의 값을 공유
        System.out.println("현재 인구 수: " + Person.population);
    }
}

클래스 변수를 활용할 때 주의사항
static 변수와 메모리는 프로그램이 종료될 때까지 유지됨
그러므로 공유가 필요한 곳에서만 활용해야함

2. final

a. final의 용도

  • 변수에 final을 붙이면 변수를 설정할 수 없음
  • 클래스는 상속 안됨
  • 메서드는 오버라이딩 불가

b. 상수(constant)

  • 변하지 않고 항상 일정한 값을 갖는 수
  • 대문자로 표현하는게 관례
  • 실행 중 절대 변경되선 안되기 때문에 static final 키워드 사용
  • static이므로 모든 인스턴스에서 같은 값 공유

예시)

c. 불변객체

  • 내부의 상태를 변경할 수 없는 객체
  • setter 없이 설계
  • 변경이 필요한 경우 새로운 객체 만들어야함
final Circle c1 = new Circle(2);

이처럼 참조변경은 불가하지만 내부값은 변경 가능한 경우를 위해
안에있는 속성들도 final 할당 해줘야함

불변객체의 값 변경이 필요한 경우

  • 기존 객체를 변경할 수 없기 때문에 새로운 객체 생성
  • 내부적으로 생성자 생성 이후 반환값 받아서 사용

3.인터페이스(Interface)

a.인터페이스란?

  • 최소한으로 지켜야하는 규칙 선언
  • 일관성을 유지하면서 클래스가 고유한 특징을 확장할 수 있도록 도움

b.사용방법

  • 클래스를 interface로 만들어 속성이나 기능 추가 후
    implements를 통해 구현(인터페이스는 상속 대신 구현이라 표현)
  • 이후 구현해야할 메서드 오버라이딩
  • 자신만의 속성이나 기능 추가 구현 가능

c. 인터페이스 다중구현과 다중상속

  • (,)를 사용해 여러 인터페이스를 구현할 수 있고 다중 상속도 가능
  • 구현과 상속 동시에도 가능 (상속이 먼저 와야함)
public class Bird extends Animal implements Fly

요런식

d. 인터페이스에 변수를 선언하는 경우

public static final이 자동으로 할당되기 때문에
객체생성없이 다른 곳에서 사용 가능

profile
김채원 판교간다

0개의 댓글