포스코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