[JAVA] 클래스/객체, static과 non-static, 원시타입/참조타입

mingsso·2023년 10월 8일
0

Java-Kotlin

목록 보기
5/17

1️⃣ 클래스, 객체, 참조변수, 생성자

클래스 (Class)

객체를 만들어 내기 위한 설계도/틀이자, 연관되어 있는 변수와 메서드의 집합임

  • 속성(필드,변수)와 동작(메서드)는 생략될 수도, 하나 이상 작성될 수도 있음
  • JVM 메모리의 메소드 영역에 로드됨


객체 (Object, =인스턴스)

클래스에 선언된 모양 그대로 생성된 실체


참조변수

생성된 인스턴스를 참조할 수 있는 변수, 인스턴스의 주소값이 저장됨

BankAccount myAcnt = new BankAccount();

  • 참조변수도 변수이므로, 참조하는 인스턴스를 바꿀 수 있음
BankAccount yoon = new BankAccount();
yoon = new BankAccount();   // yoon이 새 인스턴스를 참조함
  • 하나의 인스턴스를 둘 이상의 참조변수가 동시에 참조하는 것도 가능함
BankAccount ref1 = new BankAccount();
BankAccount ref2 = ref1;
  • 참조변수가 참조하는 인스턴스와의 관계를 끊고 아무런 인스턴스도 참조하지 않도록 하고 싶을 땐, 참조변수에 null을 대입하면 됨
BankAccount ref = new BankAccount();



생성자

인스턴스 생성 과정에서 초기화를 위해 자동으로 호출되는 일종의 메소드

  • 생성자의 이름은 클래스의 이름과 동일해야 함
  • 생성자는 값을 반환하지 않고 반환형도 표시하지 않음

위의 조건을 모두 만족하면, 이는 자바 컴파일러에 의해서 생성자로 인식됨
-> 인스턴스 생성 시 자동으로 호출되어 인스턴스를 초기화함

public BankAccount(String acc, String ss, int bal) {
	accNumber = acc;
    ssNumber = ss;
    balance = bal;
}

BankAccount yoon = new BankAccount("12-34-89", "990990-9090990", 10000);

인스턴스 생성의 마지막 단계는 생성자 호출이며, 어떠한 이유로든 생성자 호출이 생략된 인스턴스는 인스턴스가 아님

단, 생성자를 생략한 상태의 클래스를 정의하면
자바 컴파일러가 '디폴트 생성자'를 클래스의 정의에 넣어줌

class BankAccount {
	int balance;
    
    public BankAccount() {   // 컴파일러에 의해 자동 삽입되는 '디폴트 생성자'
    	// empty
    }
   	
    public int deposit(int amount) { ... }
    public int withdraw(int amount) { ... }
}

컴파일러에 의해서 디폴트 생성자가 삽입이 되더라도, 생성자는 직접 정의해 주는 것이 좋음
아주 예외적인 상황이 아니라면, 생성자가 필요없는 클래스는 잘 정의된 클래스가 아니기 때문



2️⃣ static과 non-static

클래스 변수(static)

  • 클래스 내에서 static 키워드로 선언된 변수
  • 처음 JVM이 실행되어 클래스가 메모리에 올라갈 때~프로그램이 종료될 때까지 유지됨 (JVM의 메소드 영역에 저장됨)
  • 동일한 클래스의 모든 객체들에 의해 공유됨
  • 객체를 생성하지 않고 static 변수에 접근 가능함


인스턴스 변수(non-static, =멤버변수, 필드)

  • 클래스 내에 static 없이 선언된 변수
  • 객체 생성 시마다 매번 새로운 변수가 생성됨
  • 클래스 변수와 달리 공유되지 않음

💡 전역 변수 vs 지역변수, 클래스 변수 vs 인스턴스 변수

선언위치에 따라 전역변수와 지역변수로 나눌 수 있음

  • 전역변수: 어디서든 호출이 가능함
    • 클래스 변수: 객체 생성 없이 사용가능
    • 인스턴스 변수: 객체를 생성해야 사용 가능
  • 지역변수: {특정 구역} 안에서 생성되어 그 구역 안에서만 사용할 수 있음
    전역변수를 2가지로 구분할 수 있음
class Ex_variables {
    int global_int;   // 전역변수(인스턴스 변수): 같은 객체에서 호출 가능
    static int global_statuc_int;  // 전역변수(클래스변수): 다른 객체에서도 호출 가능
	void method(){
        int local_int = 0;  // 지역변수: { }안에 생성되며 { }를 벗어나면 사용 불가
    } 
}

static 메서드

객체의 생성 없이 호출이 가능한 메소드

  • 객체 생성 후에도 호출가능 하지만 지양하는 것이 좋음
  • static 자체가 객체 지향적 관점에서는 좋은 방법이 아니며, 객체 생성 후 호출해서 사용할 것이라면 애초에 static으로 선언하지 않는게 바람직함
  • non-static 변수에 접근이 불가능함
  • 다형성을 지원하지 않기 때문에 오버라이딩 할 수 없음
  • 일반적으로는 유틸리티 관련 함수들은 여러 번 사용되므로 static 메소드로 구현을 하는 것이 적합함
    • ❓static 메소드를 사용하는 대표적인 Util Class로는 java.uitl.Math가 있음



3️⃣ 원시타입 vs 참조타입

원시타입(Primitive Type)

  • 정수, 실수, 문자, 논리 리터럴 등의 실제 데이터 값을 저장하는 타입
  • null을 담을 수 없음

참조타입(Reference Type)

profile
🐥👩‍💻💰

0개의 댓글