<객체지향>

Java는 대표적인 객체지향 언어. 객체빼면 시체

객체 = Object. 속성행위로 구성이 되어있다. 속성 = field // 행위 = method

객체지향 언어에서의 소프트웨어는 객체들의 조립. 객체들의 상호작용을 고려해야함.

상호작용 = 매개변수(parameter)를 넘겨주어 메서드를 호출시킨다.

객체 관계 : 사용 관계 // 포함 관계 // 상속 관계

 

클래스에서 자주 나오는 개념 : 캡슐화 // 상속 // 다형성 // 추상화

1.캡슐화(encapsulation) - 속성과 메서드를 하나로 묶어 객체로 만든 후, 내부 구현 내용은 외부에서 알 수 없게 감추는 것

    ==> 보안상의 이유, 외부에서 메서드를 잘못 사용하여 객체가 변하지 않게. Java에서는 접근 제어자를 써서 구현

 

2. 상속(inheritance) : 부모 객체가 가지고 있는 필드와 메서드를 자식 객체에 물려준다.

    ==> 그대로 쓸지, 가공해서 쓸건지(override) 결정해서 사용. 코드 중복이 줄어들며, 부모와 자식간의 일관성 유지 가능

 

3. 다형성 : 객체가 연산(메소드)를 수행할 때, 하나의 행위에 대해 각 객체의 속성(특성)에 따라 여러가지로 재구성되는 것

 

4. 추상화 : 객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것.

==> eg) 여러 종류의 자동차들이 공통으로 가진 가속, 브레이크, 속도와 같은 것들을 모아서 새롭게 선언

 

=======클래스를 토대로 생성된 객체(Object)를 해당 클래스의 인스턴스라고 부른다.=============

- 동일한 클래스로 여러가지 인스턴스를 만들 수 있다.

- 클래스는 설계도, 객체는 만들어진 제품이라고 볼 수 있음

 

<클래스>

생성 방법 :

1. 만들고자 하는 클래스를 선언

2. 객체가 가지고 있어야할 속성(필드)를 정의

3. 객체를 생성하는 방식을 정의(생성자) - 생성자는 클래스 이름과 동일한 이름을 가진 메서드 형태

4. 객체가 가지고있어야 할 method를 정의

 

생성자가 아무 역할(파라미터를 받거나, 로직을 수행)을 하지 않으면 기본 생성자라고 하고, 생략 가능

 

객체 생성 방법

new를 통해 ClimbingGym이라는 클래스를 인스턴스화 했고, 생성자에 넣어놓은 출력

가 실행됨.  생성된 인스턴스를 그대로 프린트해보면, 주소값이 출력된다. 참조형 변수라는 뜻. 따라서,

아래와같이 ClimbingGym 객체로 이루어진 리스트도 선언 가능하다.

객체의 필드에는, 생성된 후 변하지 않는 부분과 변하는 부분이 있다. 이를 다루기 위해 set과 get을 공부하게 될것

또한, 그 값이 또다른 객체인 필드도 있다.

Athlete객체를 만들고,

ClimbingGym 클래스에 소속 선수들을 Athlete 인스턴스로 저장할 수 있는 Array 필드를 생성,

addAthlete 메서드를 추가해준 후 Athlete를 넣어주면 작동하는 것을 볼 수 있다.

 

===============Class, 객체 관련 잡다===================

-클래스의 필드를 선언하고 초기화하지 않으면, 각 변수 type에 맞는 default 값으로 할당됨

-클래스의 필드에 외부에서 접근할 땐 Class.필드 와 같이 .을 찍어서 접근한다.

-클래스의 내부에서 필드에 접근할 때는 변수명을 바로 써서 접근 가능

-메서드는 꼭 return값이 있어야 하는건 아니다

-메서드의 파라미터는 가변길이로 선언 가능 void addAthlete(Athlete... athletes) ==> addAthlete(jay1, jay2, jay3...)

 

<클래스의 멤버>

member = field + method

클래스의 멤버는 선언하는 방법에 따라서 인스턴스 멤버 // 클래스 멤버

                           =>static 등

인스턴스 멤버 : 인스턴스 필드 + 인스턴스 메서드

클래스 멤버 : 클래스 필드 + 클래스 메서드

==> 인스턴스 멤버는 객체 생성 후 사용할 수 있고, 클래스 메서드는 객체 생성 없이도 사용할 수 있다.

==> 이유 : 객체가 인스턴스화 될 때마다 모든 메서드가 생성된다고 생각하면 메모리낭비가 심할 것을 알 수 있다.

                 따라서 메서드는 메서드 영역에 두고서 모든 인스턴스들이 공유해서 사용함. 대신, 객체를 인스턴스화                                 해야 사용할 수 있는것.

                 클래스 메서드의 경우, Java의 클래스 로더에 의해 메서드영역에 저장되기 때문에 객체생성 없이 사용O

                 이러한 메서드를 만들어주는 것이 static 이다. 고정된 영역을 가지기 때문이라고 생각하면 될듯

==>일반적으로 인스턴스마다 모두 가지고 있을 필요 없는 공용데이터를 저장하는 필드는 클래스 멤버로 선언

                                                                                                                            ->eg) static String name = "재형";

==>인스턴스 필드를 사용하지 않고 실행되는 메서드는 static을 붙여주어 클래스 메서드로 선언

==>클래스멤버는 클래스이름.멤버  와 같이 클래스이름으로 접근하는 것이 좋다. 약속 !

 

<메서드>

-------------메서드 오버로딩------------

같은 이름의 메서드로 여러가지 기능을 구현 : 매개변수의 타입 또는 개수, 순서가 다르면 동일한 이름으로 정의 가능

대표적인 예시가, println() : 들어오는 매개변수의 type에 따라 다른 방법으로 출력해야 하기 때문. println의 정의 보면 앎

장점 : 같은 기능에 대해 메서드 이름을 절약할 수 있으며, 혼선을 방지 가능

 

--------------기본형 & 참조형 매개변수-----------

매개변수의 타입이 기본형일때는, 값이 복사되어서 넘어가기때문에 원본값 변경X

매개변수의 타입이 참조형일때는, 주소값을 넘겨주기 때문에 메서드 내에서 원본값 변경 가능

 

 

 

 

+ Recent posts