[JAVA] 04. 클래스, 객체

gogori6565·2022년 9월 29일
0

JAVA

목록 보기
8/11

클래스 (class)

클래스

  • class 키워드로 선언

필드와 메소드

  • 필드(field) : 객체 내 멤버 변수
  • 메소드(method) : 함수, 객체의 행동을 구현

접근지정자

1) public : 어디서든 접근 허용
2) protected : 상속관계에 놓여있을 때, 유도 클래스에서의 접근 허용
3) private : 클래스 내 (클래스 내에 정의된 함수) 에서만 접근 허용
4) 디폴트 : 접근지정자 생략

생성자

  • 클래스의 이름과 동일한 특별 메소드
  • 각 객체가 생성될 때 자동으로 한 번 호출됨

객체 생성

new 키워드로 생성

객체 멤버 접근

레퍼런스.멤버

//Circle 클래스 이름

//객체 생성 - new 사용
Circle pizza;
pizza = new Circle();

//객체 멤버 접근 - (.)연산자
pizza.radius=10;
pizza.name="피자";

생성자

객체가 생성될 때 초기화를 위해 실행되는 메소드.

  • 각 객체마다 객체 생성 시 자동으로 한 번 호출된다
  • 클래스 이름과 반드시 동일해야한다
  • 리턴타입을 지정할 수 X
  • 개발자가 생성자를 작성하지 않았다면 컴파일러가 자동으로 기본 생성자를 삽입해 호출한다

default constructor (기본 생성자)

매개변수가 없고 아무 작업 없이 리턴하는 생성자, 클래스에 생성자가 하나도 선언되지 않았을 경우 컴파일러에 의해 자동 삽입됨
(하나라도 선언 되었다면 자동 삽입 X)


this 레퍼런스

객체 자신에 대한 레퍼런스, this.멤버

[주로 쓰이는 경우]
1. 객체의 멤버 변수와 메소드 변수 혹은 메소드의 매개변수와 이름이 같을 때
2. 다른 메소드 호출 시 객체 자신의 레퍼런스를 전달할 때
3. 메소드가 객체 자신의 레퍼런스를 반환할 때

this() 다른 생성자 호출

  • 클래스 내의 다른 생성자 호출
  • 생성자 내에서만 사용 가능
  • 반드시 생성자 코드의 제일 처음에 수행
public Book(String title){
	this(title, "작자미상");
}

public Book(String title, String author){
	this.title=title;
    this.author=author;
}

//main 내 코드 중
Book loveStory = new Book("춘향전");
//1번 생성자로 갔다가 2번 생성자로 옮겨져 "춘향전 작자미상" 이 된다.

메소드 (method)

  • 자바의 모든 메소드는 반드시 클래스 안에 있어야 함 (캡슐화 원칙)

인자 전달 방식

  1. 기본 타입의 값 전달
  • 값이 복사되어 전달
  • 메소드의 매개변수가 변경되어도 호출한 실인자 값은 변경되지 않음 ('값에 의한 호출' 이기 때문)
  1. 객체 혹은 배열 전달]
  • 객체나 배열의 레퍼런스만 전달, 즉 통째로 복사되는 것이 아님
  • 실인자 객체나 배열 공유 (참조에 의한 호출)

메소드 오버로딩 (Overloading)

이름이 같은 메소드를 작성할 수 있다

  • 단, 매개변수의 개수나 타입이 서로 달라야함 (리턴 타입은 상관 X)

객체 소멸

new 에 의해 할당된 객체 메모리를 가용 메모리로 되돌려주는 행위

  • 자바에서는 임의로 객체를 소멸할 수 없음! (개발자 : "오히려좋아")

가비지 컬렉션

가비지 : 가리키는 레퍼런스가 하나도 없는 객체 (사용할 수 없게 된 메모리)

가비지 컬렉션 : 자바 가상 기계의 '가비지 컬렉터'가 자동으로 가비지 수집 반환

  • 개발자에 의해 강제로 가비지 컬렉션을 호출할 수 있다. System.gc()

접근 지정자

1) private : 동일 클래스 내에서만 접근 헝용
2) protected : 같은 패키지 내 모든 클래스에서 접근 허용 및 상속 받은 서브 클래스는 다른 패키지에 있어도 접근 가능
3) public : 다른 모든 클래스에서 접근 허용
4) 디폴트 (접근지정자 생략) : package-private라고도 함. 같은 패키지의 클래스에만 접근 허용


static

non-static 의 특성

한 마디로 공유 안함.

1) 공간적 특성 : 멤버들은 객체마다 독립적으로 별도 존재 ('인스턴스 멤버' 라고 부름)
2) 시간적 특성 : 필드와 메소드는 객체 생성 후 사용 가능
3) 비공유 특성 : 멤버들은 다른 객체에 의해 공유되지 않고 배타적

static

객체마다 생기는 것이 아니라 클래스 당 하나만 생성됨, 클래스 멤버라고도 부름
객체를 생성하지 않고도 사용 가능

한 마디로 공유함.

[특성]
1) 공간적 특성 : static 멤버들은 클래스 당 하나만 생성 ('클래스 멤버' 라고 부름)
2) 시간적 특성 : static 멤버들은 클래스가 로딩될 때 공간 할당
3) 공유의 특성 : static 멤버들은 동일한 클래스의 모든 객체에 의해 공유

class StaticSample {
//non-static
int n; // non-static 필드
void g() {...} // non-static 메소드

//static
static int m; // static 필드
static void f() {...} // static 메소드
}

static 멤버 접근

  1. 객체의 멤버로 접근
Circle c1;
c1.m; //static m
  1. 클래스의 멤버로 접근
Circle.m; //static m

static의 활용

  1. 전역 변수와 전역 함수를 만들 때 활용
  • static 멤버를 가진 클래스 사례
    • Math 클래스 : java.lang.Math
      1) 모든 필드와 메소드가 public static으로 선언
      2) 다른 모든 클래스에서 사용할 수 있음
  1. 공유 멤버를 작성할 때
  • static 필드나 메소드는 하나만 생성. 클래스의 객체들 공유

static 메소드의 제약 조건

  1. static 메소드는 non-static 멤버 접근할 수 없음
  • 객체가 생성되지 않은 상황에서도 static 메소드는 실행 가능하기에 static 메소드에서 non-static 메소드와 필드 사용 불가
  • 반대로, non-static 메소드에서 static 사용은 가능
  1. static 메소드는 this 사용불가!
  • static 메소드는 객체가 생성되지 않은 상황에서도 호출이 가능하므로, 현재 객체를 가리키는 this 레퍼런스를 사용할 수 없음

final 클래스와 메소드

final 클래스

클래스 상속 불가

final class FinalClass {
.....
}
class SubClass extends FinalClass { // 컴파일 오류. FinalClass 상속 불가
.....
}

final 메소드

오버라이딩 불가

public class SuperClass {
	protected final int finalMethod() { ... }
}

class SubClass extends SuperClass { // SubClass가 SuperClass 상속
	protected int finalMethod() { ... } // 컴파일 오류, 오버라이딩 할 수 없음
}

+) 오버라이딩이란?
오버로딩(overloading)이란 서로 다른 시그니처를 갖는 여러 메소드를 하나의 이름으로 정의하는 것이었습니다.

오버라이딩(overriding)이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것이라고 할 수 있습니다.

final 필드

final 필드, 상수 선언

  • 상수를 선언할 때 사용
class SharedClass{
	public static final double PI = 3.14;
}
  • 상수 필드는 선언 시 초기값 지정해야함
  • 상수 필드는 실행 중 값 변경 불가
profile
p(´∇`)q

0개의 댓글