[Java] 객체 지향 - 1

2024. 8. 5. 15:27Java/객체지향

객체란?

객체는 물리적으로 존재하거나 개념적인 것 중에 다른 것과 식별이 가능한 것을 말한다. 객체는 속성과 동작으로 구별되는데 이를 각각 필드와 메서드라고 부른다. 

현실 세계의 객체를 소프트웨어 객체로 설계하는 것을 객체 모델링이라고 한다. 

 

객체의 상호 작용

 

객체 지향 프로그램에서 객체들은 메서드를 통해 다른 객체와 서로 상호작용하면서 동작한다. 메서드는 다음과 같은 형태를 가지고 있다. 

메서드(매개값1, 매개값2 ...);

 

메서드 호출을 통해 객체들은 서로 데이터를 주고 받는데, 이 때 메서드 이름과 함께 전달할 데이터를 괄호 안에 기술하는데 이를 매개값이라고 한다. 리턴값은 메소드의 실행 결과이며, 호출한 곳으로 돌려주는 값이다. 

 

객체 간의 관계

객체는 대부분 다른 객체와 관계를 맺고 있다. 관계의 종류에는 집합, 사용, 상속 관계가 있다. 

 

집합: 완성품과 부품의 관계 ex) 자동차와 부품 관계

사용: 다른 객체의 필드를 읽고 변경하거나 메서드를 호출하는 관계 ex) 사람이 차를 달리게 한다, 멈춘다 

상속: 부모와 자식 관계. ex)자동차가 기계에 특징을 물려받는다

 

객체 지향 프로그래밍의 특징

객체지향프로그래밍의 특징은 캡슐화, 상속, 다형성이 있다. 

 

캡슐화: 객체의 필드와 메서드를 하나로 묶고 실제 구현 내용을 외부에 감추는 것. 외부 객체는 객체 내부의 구조를 알 수 없고 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다. 접근을 제어하기 위해 접근 제한자를 사용한다. 

 

상속: 부모 객체는 자기가 가진 필드와 메서드를 자식에게 물려주어 사용할 수 있도록 한다. 이를 통해 코드 재사용성을 높이고, 유지 보수 시간을 줄일 수 있다. 

 

다형성: 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질을 말한다. 자동차의 부품을 교환하면 성능이 다르게 나오는 것과 유사하다. 

 

객체와 클래스

객체를 생성하기 위해서는 설계도에 해당하는 클래스가 필요하다. 클래스로부터 생성된 객체를 인스턴스라고 하고, 만드는 과정을 인스턴스화라고 한다. 동일한 클래스로부터 여러 개의 인스턴스를 만들 수 있다. 

 

클래스 선언

클래스 선언은 객체를 어떻게 생성하고(생성자), 객체가 가져야할 데이터가 무엇이고(필드), 객체의 동작은 무엇인가를 정의하는 내용(메서드)이 포함된다. 

public class 클래스명 {
}

 

public class는 공개 클래스를 선언한다는 뜻이다. 클래스 명은 대문자로 하고 캐멀 스타일로 작성한다. 숫자는 첫 문자에 올 수 없고, 특수문자 중에 $과 _를 포함할 수 있다. 

 

객체 생성과 클래스 변수

클래스로부터 객체를 생성하려면 생성 연산자인 new가 필요하다. 

new 클래스명();

 

new 연산자는 객체를 생성시킨 후 객체의 주소를 리턴한다. 그래서 다음과 같이 클래스 변수에 대입할 수 있다. 

클래스 변수 = new 클래스();

 

클래스는 라이브러리와 실행 클래스로 나뉘어져 있다. 전자는 실행할 수 없으며 다른 클래스에서 이용하는 클래스이고, 후자는 메서드를 가지고 실행이 가능한 클래스이다. 

 

클래스의 구성 멤버

클래스 선언에는 생성자와 필드, 메서드 코드가 포함된다. 이를 구성 멤버라고 한다. 

주의할점은 생성자는 메서드와 비슷하지만 리턴 타입이 없고 이름은 클래스 이름과 동등하다는 것이다. 

 

필드 선언과 사용

필드는 객체의 데이터를 저장하는 역할을 한다. 객체 데이터에는 고유 데이터, 현재 상태 데이터, 부품 데이터가 있다. 

 

필드를 선언하는 방법은 변수 선언과 동일하다. 단, 반드시 클래스 블록에서 선언되어야만 한다. 

타입 필드명 [ = 초기값];

 

초기값을 제공하지 않을 경우에 자동으로 초기값이 된다. 

필드 사용

필드를 사용한다는 말은 필드값을 변경한다는 의미이다. 클래스로부터 객체를 생성한 이후에 필드를 사용할 수 있다. 필드는 객체 내부의 생성자와 메소드 내부에서 사용할 수 있고, 객체 외부에서도 접근할 수 있다. 

 

내부에서는 필드명을 읽고 변경할 수 있지만, 외부 객체에서는 참조 변수와 도트(.) 연산자를 이용해 필드를 읽고 변경해야 한다. 

 

기본 생성자

모든 클래스는 생성자가 존재하며, 하나 이상을 가질 수 있다. 생성자가 없으면 컴파일러가 기본 생성자를 바이트코드에 자동으로 추가시킨다. 

[public] 클래스() {}

 

그러나 개발자가 명시적으로 명시한 생성자가 있다면 컴파일러는 기본 생성자를 추가하지 않는다

 

생성자 선언

생성자는 다음과 같이 직접 선언할 수 있다. 

클래스(매개변수 ...) {
	//초기화 코드
}

생성자는 메소드와 비슷해보이나 리턴 타입이 없고 클래스 이름과 동일하다. 매개변수는 new 연산자로 생성자를 호출할 때 매개값을 생성자 블록 내부로 전달하는 역할을 한다. 

Car mycar = new Car("그랜저", "검정", 300);

 

필드 초기화

객체마다 동일한 값을 가지고 있다면 필드 초기화값을 대입하는 것이 좋고, 다른 값을 가져야 한다면 생성자에서 필드를 초기화시켜주는 것이 좋다. 

 

매개변수명이 필드명과 동일하다면 현재 객체를 가리키는 this로 써야 한다. 

    public class Korean {
      String nation;
      String name;
      String ssn;

      public Korean(String name, String ssn) {
        this.name = name;
        this.ssn = ssn;
      }
    }

 

생성자 오버로딩

매개값으로 객체의 필드를 다양하게 초기화하려면 생성자 오버로딩이 필요하다. 생성자 오버로딩이란 매개변수를 달리하는 생성자를 여러 개 선언하는 것을 의미한다. 매개변수 타입과 개수, 선언된 순서가 똑같은 경우에는 생성자 오버로딩이 아니다. 

 

 

생성자 오버로딩이 많아진 경우에는 중복을 지우기 위해 공통 코드를 작성하고 나머지는 this를 사용하여 생성자를 호출하는 방법이 있다. 

this는 생성자의 첫 줄에 작성된다. 

 

'Java > 객체지향' 카테고리의 다른 글

[Java] 인터페이스  (0) 2024.08.15
[Java] 상속 2  (0) 2024.08.14
[Java] 객체 지향 연습 정답  (0) 2024.08.13
[Java] 객체 지향 연습 문제  (0) 2024.08.13
[Java] 객체 지향 - 3  (0) 2024.08.09