포스코x코딩온 웹 풀스택 양성과정

[포스코x코딩온] 웹 풀스택 과정 16주차 회고 | JAVA 클래스와 인스턴스

Codult 2024. 4. 5. 15:33
728x90

 

📌 객체지향 프로그래밍 (Object-oriented Programming)

필요한 데이터와 코드를 묶어 '하나의 객체'로 만들고 이 객체들 간에 상호작용을 하도록 프로그램을 만드는 방식이다.

  • 코드 재사용, 유지보수에 용이하다.
  • 절차지향 프로그래밍에 비해 처리속도가 느리고, 설계가 복잡하다.


📌 클래스

객체를 정의하는 틀 또는 설계도이다.
클래스라는 설계도를 가지고 여러 객체를 생성하여 사용한다.

  • 클래스 이름은 대문자, Camelcase로 작성한다.

필드

클래스 내에서 값을 저장하는 변수

  • private: 해당 클래스 내에서만 사용가능하도록 하여, 외부 클래스에서 직접 수정하는 것을 방지한다.
public int number; //외부 클래스에서 직접 수정 가능 (좋지 않음)
private String name; //외부 클래스에서 직접 수정 불가능


메소드

클래스 내에 선언된 함수

  • 접근 제어자: 외부에서의 접근 제한을 걸어주는 역할을 한다.
    public: 패키지와 관계없이 모든 클래스에서 접근 가능하다.
    protected: 같은 패키지 내 모든 클래스에서 접근 가능하다. (다른 패키지에서 접근 불가능, but 상속 받은 서브클래스에서는 접근이 가능함)
    default: 같은 패키지 내의 모든 클래스에서 접근이 가능하다. (다른 패키지에서 접근 불가능)
    private: 같은 클래스에서만 접근 가능하다.
  • 리턴타입: 메소드의 리턴 타입을 적어준다. (없으면 void)
private int speed;

public void increaseSpeed(int speed) {
	this.speed = this.speed + speed
}


getter와 setter

public 메소드(getter, setter)를 이용하여, private로 지정한 클래스의 변수에 간접적으로 접근한다.

  • getter: 필드 값을 가져온다.
public int getSpeed() {
	return speed;
}
  • setter: 필드 값을 설정한다.
public void setSpeed(int speed) {
	if (speed > 0) { //유효성 검사
    	this.speed = speed;
    }
}


생성자

객체가 생성될 때 자동으로 호출되는 메소드

  • 생성자의 이름은 클래스 이름과 같아야 한다.
  • 생성자는 리턴 타입을 적지 않는다.
  • 필드 값을 특정 값으로 지정하여 객체를 생성할 수 있다. (지정하지 않는 경우, 생략가능)
public Car (int speed) {
	this.speed = speed;
}


📌 인스턴스

클래스를 사용하기 위해 선언한 해당 클래스 타입의 객체(메모리에 할당된 객체)를 뜻한다.

  • new 키워드를 이용하여 생성한다.
  • 하나의 클래스로부터 여러 개의 인스턴스를 생성할 수 있다.
  • 생성된 인스턴스는 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있다.
public class CarContainer {
	public static void main(String[] args) {
    	Car bmw = new Car(30); // 인스턴스 생성
        Car kia = new Car(40); // 인스턴스 생성
        
        bmw.start();
        kia.start();
        
        bmw.setSpeed(120);
        bmw.increaseSpeed(100);
        
        System.out.println("bmw : " + bmw.getSpeed());
    }
}


📌 Static

Static멤버(변수, 메소드)는 객체마다 생성되는 것이 아니라, 클래스가 생성되는 순간에 메모리를 할당받아 동일한 클래스의 모든 인스턴스에 공유된다.
(non-static은 객체가 생성될 때마다 새로운 멤버 공간이 만들어진다. 즉, 메모리 공간이 공유되지 않는다.)

  • 객체를 생성하지 않아도 static 멤버에 접근이 가능하다.
  • static 변수는 공유의 목적으로 많이 사용된다.
  • 유틸리티성 메소드를 작성할 때, static 메소드를 많이 사용한다. (ex. java.lang 패키지의 Math 클래스)
  • non-static 메소드에서 static 메소드 접근은 가능하지만, static 메소드에서 non-static 메소드 접근은 불가능하다.
  • static 메소드에서는 this 키워드 사용 불가능하다.

예시 - static 변수

// static 없는 경우
class WithoutStatic {
	private int registered = 0;
    private String name;
    
    public WithoutStatic (String name) {
    	this.name = name;
        registered++;
    }
    
    public int getRegistered() {
    	return registered;
    }
}

// static 있는 경우
class WithStatic {
	private static int registered = 0; // 이 registered 값은 모든 인스턴스에 공유됨
    private String name;
    
    public WithStatic (String name) {
    	this.name = name;
        registered++;
    }
    
    public int getRegistered() {
    	return registered;
    }
}

public class CompareStatic {
	public static void main (String[] args) {
    	WithoutStatic a = new WithoutStatic("person1");
        WithoutStatic b = new WithoutStatic("person2");
        System.out.println(a.getRegistered());	// 1
        System.out.println(b.getRegistered());	// 1
        WithoutStatic c = new WithStatic("person3");
        WithoutStatic d = new WithStatic("person4");
        System.out.println(c.getRegistered());	// 2
        System.out.println(d.getRegistered());	// 2
    }
}

예시 - static 메소드

class MathUtil {
	private static double PI = 3.14;
    
	// static 메소드    
    public static double circle(double radius) {
    	return PI * radius * radius;
    }
}

public class CompareStatic {
	public static void main (String[] args) {
    	// 객체 생성하지 않아도 static 메소드 접근이 가능하다.
    	double circle = MathUtil.circle(4.3);
    }
}
728x90