JAVA 클래스

문세연·2024년 8월 21일

JAVA

목록 보기
4/19

클래스(반)

공통 요소를 한 번만 선언해놓고 가져다 사용하도록 설계한다.

1. 타입이다.
클래스 안에 선언된 변수와 메소드를 사용하고 싶다면,
해당 클래스 타입으로 객체를 선언해야한다.

2. 주어이다.
원숭이가 바나나를 먹는다.
Monkey.eat("바나나")

링크텍스트

추상화란?

객체의 공통적인 특성을 추출하여 인터페이스나 추상 클래스로 정의하는 것

객체화(instance)

추상적인 개념을 구체화 시키는 작업

즉, 클래스를 선언하는 이유?

딱 한 번만 선언해서 재사용하기 위해서 사용한다.

  • 인스턴스 멤버 : 멤버변수에서 static이 붙지 않으면 인스턴스 멤버라고 하는데, 외부에서 사용할 시 반드시 new 연산자로 객체를 생성해야지만 접근이 가능하다. 외부에서 객체를 생성하여 인스턴스 멤버를 사용하는 것을 인스턴스화, 객체화라고 한다. 객체를 생성한 후에는 객체 참조 연산자(.) 를 사용해 "인스턴스명 . 인스턴스변수명"으로 변수를 참조할 수 있다.

  • 정적 멤버 (클래스 멤버) : static이 붙은 변수를 정적 멤버 혹은 클래스 멤버라고 부른다. 인스턴스를 생성하지 않아도 접근 가능함.

클래스를 사용하는 방법
사용하기 위해서는 해당 클래스의 타입으로 선언해야한다.

클래스 선언
class 클래스명 {
필드(변수, 메소드)
}

클래스의 필드 사용

1. 객체화(instace)
- 객체(instance variable)를 만드는 작업
- 추상적인 개념을 구체화시키는 작업!

※ .(마침표)
- 하위 연산자, 멤버변수 접근 연산자, 닷 연산자, 점 연산자
- 주소값 뒤에서만 사용이 가능하며 해당 주소를 참조하는 명령어이다.

생성자(Constructor)

링크텍스트

클래스 이름 뒤에 소괄호가 있는 형태, 메소드와 기능이 똑같지만 메소드라고 부르지 않는다.
생성자는 리턴이라는 기능이 존재하지 않기 때문이다.

즉, 생성자의 역할은 해당 클래스의 필드를 메모리에 할당한 후 부여된 주소값을 가져온다.

기본 생성자
매개 변수가 없는 생성자, 클래스 선언 시 자동으로 선언된다.
사용자가 직접 생성자를 선언하게 되면 기본 생성자는 자동으로 만들어 지지 않는다.

this
필드에 접근한 객체가 누구인지 알아야 해당 필드에 접근 할 수 있다.
이 때 접근한 객체가 가지고 있는 할당된 필드의 주소값을 this라는 변수에 자동으로 담긴다.


다형성(polymorphism)

1. 오버로딩(Overloading)

매개변수의 개수 또는 타입이 다르면 동일한 이름으로 선언할 수 있다.

2. 오버라이딩

추상클래스(abstract)
필드 안에 구현이 안된 메서드가 선언되어 있는 클래스를 추상 클래스라고 한다.
이 때 구현되지 않은 메서드를 추상 메서드라고 부른다.
반드시 재정의를 통해 구현을 해야지만 메모리에 할당되기 때문에
"강제성"을 부여하기 위해서 추상메서드를 선언한다.

  • ex ) Red, Blue, Yellow 같은 실체 클래스에서 공통되는 필드와 메소드를 따로 선언한 Color 클래스를 만들 수 있고, 이것을 상속해서 실체 클래스를 만들 수 있다.

추상 클래스는 실체 클래스의 공통되는 필드와 메소드를 추출해서 만들었기 때문에, new 연산자를 사용해서 객체를 직접 생성할 수 없다.

Color color = new Color();

-> heap 이라는 메모리에 new 라는 연산자를 사용해서 Color에 해당하는 주소값을 들고 온다. color라는 저장공간에 이를 다시 할당한다. 생성과 할당을 동시에 한 것.

추상 클래스는 새로운 실체 클래스를 만들기 위한 부모 클래스로 사용됨. 즉, 추상 클래스 = extends 뒤에만 사용.

class Red extends Color(
...
)

추상 클래스 선언

클래스 선언에 abstract 키워드를 붙이면 추상 클래스 선언이 된다. new 연산자를 이용해 객체를 직접 만들지 못하고, 상속을 통해 자식 클래스만 만들 수 있음.

public abstract class 클래스명(
	//필드
    //생성자
    //메소드
)

인터페이스(interface) : 틀
추상 클래스를 고도화시킨 문법.
상수와 추상메소드만 존재한다.
구현은 지정한 클래스에서 진행하고, 인터페이스를
다른 클래스에 지정할 때에는 implements 키워드를 사용한다.

  • 쉽게 말해서, 인터페이스는 두 장치를 연결하는 접속의 역할을 함.

추상 클래스와 인터페이스 간의 관계

인터페이스를 클래스에 바로 지정하면 모든 메소드에 강제성이 부여되어서 전부 다 구현(implements)해야 한다. 하지만 일반적인 상황에서는 모든 것이 아닌, 필요한 메소드만 골라서 재정의해야한다.
인터페이스를 직접 지정하지 않고 다른 클래스에 지정한 후 바디를 만들어 놓는다면, 강제성이 소멸되고 이 클래스를 상속받아서 필드를 구현한다면, 골라서 재정의할 수 있게 된다.
이 때 중간에서 강제성을 없애주는 클래스를 추상 클래스로 선언하기도 하며 추상클래스 이름 뒤에는 Adapter를 붙여서 목적을 알려준다.

결론 : 인터페이스는 타입이다.

내부 클래스(Inner class)

하나의 클래스에서 a작업과 b작업이 있을 때에는 따로 분리하여 클래스 만들지 않고, 클래스 안에 클래스를 선언하여 설계한다.

이 때 밖에 있는 클래스를 외부 클래스라고 하며, 안에 선언된 클래스를 내부 클래스라고 한다. 외부 클래스가 메모리에 할당되어야 내부 클래스를 객체화할 수 있기 때문에 클래스를 숨기기 위해서 내부 클래스를 사용하기도 하며, 이를 캡슐화 또는 은닉화라고 한다.

내부 클래스는 외부 클래스의 필드이기 때문에 외부 클래스의 필드를 자신의 필드처럼 가져다 사용할 수 있지만 상속관계가 아니기 때문에 내부 클래스일지라도 extends를 통해 다른 클래스를 상속받아서 사용할 수 있다.

※ 어떤 영역 안에 선언된 클래스는 내부 클래스이다.

익명 내부 클래스(Anonymous Inner class)

이름이 없는 클래스이며 구현되지 않은 필드를 구현하기 위해 일회성으로 생성되는 클래스이다.

profile
안녕하세용!

0개의 댓글