[JAVA] 자바를 JAVA (3)

wannabeing·2025년 3월 4일
0

SPARTA-TIL

목록 보기
3/22

✅ 클래스 (Class)

객체를 만들기 위한 설계도 (ex. 자동차 설계도)

public class Car {
	private String color; // 색상
    private String Model; // 모델명
    private int cc;       // 배기량
    private int speed;     // 속도
  	
    // 가속 메서드
	public void accelerate() { ... }
    
    // 감속 메서드
    public void decelerate() { ... }
    
    // 시동 메서드
    public void start() { ... }
    
    // 정지 메서드
    public void stop() { ... }
    ...
}

클래스 구조

1. 속성

변수 선언으로 표현

public class Car {
	// ✅ 속성
	private String color; // 색상
    private String Model; // 모델명
    private int cc;       // 배기량
    private int speed;     // 속도
}

2. 생성자

  • 없으면 클래스를 객체화(인스턴스화) 할 수 없음
  • 기본 생성자는 자동으로 생성되고, 원하면 수정할 수 있음
public class Car {
	...
    // ✅ 생성자
    public Car(){
    	... 
    }
}

3. 기능(메서드)

public class Car {
	...
    // 가속 메서드
	public void accelerate() { ... }
    
    // 감속 메서드
    public void decelerate() { ... }
    
    // 시동 메서드
    public void start() { ... }
    
    // 정지 메서드
    public void stop() { ... }
    ...
}

✅ 객체 (Object)

  • 클래스를 기준으로 만든 구체적인 대상 (ex. 실제 자동차)
  • 객체를 만들 때는 new라는 키워드를 사용한다.
  • 객체를 만드는 과정을 "인스턴스화" 라고 한다.
  • 객체는 실제로 메모리 상에 존재한다.
Car gv70 = new Car();
Car g80 = new Car();

gv70.start();
g80.starT();
...

✅ 인스턴스

  • 특정 클래스로 생성된 개별적/구체적 객체 (GV70, G80)
  • 특정 클래스로부터 생성된 객체라는 의미가 강조된 용어

✅ JVM 메모리 영역

JVM 메모리 구조는 3가지이다.

1) MethodArea (클래스 정보 저장공간)

  • 프로그램 실행 시, 모든 *.class 파일의 데이터가 저장되는 공간
  • 프로그램 실행 시점에 1번만 저장
  • static 으로 선언된 변수와 메서드들의 저장공간
  • 저장된 데이터는 프로그램 전체에서 공용으로 사용가능

2) HeapArea

  • 객체(new)가 생성되어 저장되는 공간
  • new 키워드로 생성된 객체들의 정보가 저장되는 공간

3) StackArea

  • 메서드 실행시 사용되는 공간
  • 메서드가 호출될 때마다 해당 영역에 메모리 할당 받음
  • 메서드 종료 시, 메모리에서 삭제
  • 변수가 객체를 담고 있다면, 객체의 주소값이 이 곳에 저장됨

✅ 레퍼클래스

기본 자료형을 감싸고 있는 클래스



✅ 참조형

  • 변수에 객체가 담기면 그 변수를 참조형 변수라고 한다.
  • 해당 변수에는 개체가 저장된 Heap메모리 주소를 가르키고 있다.
  • 따라서, 레퍼클래스도 참조형 변수이다.
    하지만 내부적으로 주소가 아닌 값을 출력하게 설정되어 있다!

❓ 레퍼클래스는 왜 사용할까?

  • 기본형 변수는 객체처럼 기능이 없다.
  • 참조형 변수는 객체를 가르키고 있기 때문에 객체의 기능을 사용할 수 있다.
  • ex. Integer -> String은 내부 기능으로 쉽게 변환 가능
  • 레퍼클래스는 new 키워드 없이 사용이 가능하다.
  • 레퍼클래스 <-> 기본형 변수는 형변환이 자주 일어나는데, Java에서는 이 과정을 자동으로 지원해주고 있다.

✅ 오토박싱

  • 기본형 변수 → 레퍼클래스
  • Integer는 참조형 변수이지만, int형 값을 직접 대입 가능하다.
Integer num = 10;

✅ 오토언박싱

  • 레퍼클래스 → 기본형 변수
Integer num = 10;
int number = num;

💡 오토박싱 vs 오토언박싱

  • 오토박싱은 반복연산 시, 불필요한 추가작업이 많아진다.
  • 따라서, 빠른 작업을 하기 위해선 기본형을 사용하는게 좋다!

✅ static 키워드

  • 모든 객체가 함께 사용하는 변수/메서드를 만들 때 사용
  • 객체를 만들지 않아도 클래스 이름만으로도 바로 사용가능
  • 모든 객체가 같은 값을 공유한다.
  • static 변수와 메서드는 한번만 생성된다.
    MethodArea에 저장되기 때문!

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

  • 각 객체(인스턴스)가 고유적으로 갖고 있는 변수와 메서드
  • 객체를 생성해야 접근이 가능하다.
  • 각 객체는 고유한 값을 가진다.
class Person {
		// ✅ 인스턴스 변수
		String name; 
        
		// ✅ 인스턴스 메서드
		void printName() { 
				System.out.println("나의 이름은 " + this.name + "입니다.");
		}
}

✅ 클래스 멤버 (클래스 변수 + 클래스 메서드)

  • 클래스 자체에 속하는 변수와 메서드
  • 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 사용시 주의사항

  • 공유가 필요한 곳에서만 사용해야 한다
    MethodArea에 공유되므로 불필요한 메모리 차지하지 않게 하기 위해

  • static 메서드에서 인스턴스 변수 접근시 접근할 수 없음

    public class Person {
       String name;
    
       public static void staticMethod() {
           System.out.println(this.name);  // ❌ 접근할 수 없음 !!!!
       }
    }

✅ final 키워드

1) final 키워드의 용도

  • 변수에 붙이면 값을 변경할 수 없게 한다.
    final int a = 100;
     a = 200; // ❌ 오류 발생!
  • 클래스 앞에 붙이면 상속할 수 없게 한다.
  • 메서드에 붙이면 수정할 수 없게 한다. (오버라이딩 불가)

✅ 상수 (Constant)

  • 변하지 않고 일정한 값을 갖는 수

  • Java에서는 대문자로 표현

  • 실행중 변경되면 안되므로 static final 키워드 사용

    public class Circle {
    
       final static double PI = 3.14159; // ✅ 상수 선언
    }

    ✅ 불변 객체 (Immutable Object)

  • 내부 상태를 변경할 수 없는 객체

  • 속성을 final로 선언해야 함

  • setter 없이 설계

  • 변경이 필요한 경우에는 새로운 객체를 생성해야 함

public final class Circle {

   final static double PI = 3.14159; 
   final double radius; // ✅ final 로 선언해서 값이 변경되지 않도록 합니다.

   public Circle(double radius) {
       this.radius = radius;
   }

   // ✅ 반지름이 다른 새로운 Circle 생성 (불변 객체 유지)
   public Circle changeRadius(double newRadius) {
       // 생성자 호출: 기존 객체 변경 X, 새 객체 생성
       return new Circle(newRadius); 
   }
}
public class Main {
    public static void main(String[] args) {
        circle c2 = new Circle(20);
        circle c3 = c2.changeRadius(30); // 보기엔 불변객체가 아닌 것처럼 보임
    }
}

출처
스파르타 코딩클럽 자바 문법 종합반 2주차

profile
wannabe---ing

0개의 댓글