새소식

Java

4. 객체

  • -

 

 

객체

객체란 두 가지 의미로 설명할 수 있다.

1. 자신의 속성을 가지고 있으면서 식별이 가능한 것

2. 클래스에서 정의한 것을 토대로 메모리에 할당된 것

 

 

객체지향 프로그래밍(Object-Oriented Programing, OOP)

주변의 사물이나 추상가능한 것을 객체로 만들고, 객체들 간의 상호작용을 이용하여 프로그래밍하는 방법

객체지향 언어의 특징으로는

- 추상화(Abstruction): 현실의 객체를 추상화( 본질적이고 공통적인 부분을 모아 정의하는 것)

- 다형성(Polymorphism): 하나의 객체를 여러가지 타입으로 참조

- 상속(Inheritance): 부모 클래스를 자식 클래스로 정의하여 코드의 재사용

- 캡슐화(Encapsulation): 데이터를 외부에 노출시키지 않게 보호

 

=> 현실의 객체는 추상화 되어 클래스로 정의되고, 클래스는 구체화되어 프로그램의 객체가 된다.

 

 

 

 

클래스(Class)? 객체(Object)? 인스턴스(Instance)?

- 클래스: 객체를 만들어 내기 위한 설계도(틀)

- 객체: SW 세계에 구현할 대상

- 인스턴스: 설계도를 바탕으로 SW 세계에 구현된 구체적인 실체

=> 객체란 클래스의 인스턴스이다.

보통 특정 클래스를 선언하면 객체라고 하고 실질적으로 메모리에 할당하기 시작하면(new) 인스턴스라고 부르는 것 같다.

/* 클래스 */
public class Animal {
  ...
}
/* 객체와 인스턴스 */
public class Main {
  public static void main(String[] args) {
    Animal cat, dog; // '객체'

    // 인스턴스화
    cat = new Animal(); // cat은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
    dog = new Animal(); // dog은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
  }
}

 

 

 

JVM의 메모리 구조( meta-space, Call Stack, Heap)

- meta-space: 클래스의 정보와 static 변수들을 여기에 저장한다.

- Call Stack: 메서드를 호출하면 메서드는 Call Stack에 올라가고, 끝난 뒤 삭제

- Heap: 클래스로 객체를 만들고 할당할 때 저장되는 곳이 여기다.

 

여기서 연관된 이야기로 지역 변수의 명시적 초기화가 있다. 지역 변수는 다른 변수들과 달리 명시적 초기화가 필수적인데 Call Stack에 빈번하게 삽입, 삭제되는 과정에서 자동으로 초기화를 해주면 연산이 많아져 시간이 걸리므로 초기화가 없어졌기 때문이다.

 

 

 

 

Static

- 한마디로 정의하자면 공유 변수 or 메서드

- 객체를 선언했을 때, Static은 먼저 선언되어 메모리에 올라가는 모든 객체들이 공유하는 값임

- 반면 Static이 없는 맴버 변수들은 객체를 메모리에 올렸을 때 선언

- 단 그 객체를 사용하지 않는다면 컴파일 단계에서 배제됨

 

 

 

 

Method

- 특정한 객체 내에 종속된 서브 루틴

- 객체에 종속된다는 점이 Function과의 차이점(자바는 Function 미지원)

 

Variable argument: 메서드 선언 시 동일 타입 인자의 수를 가변적으로 적용해야 할 경우 사용한다.

- (자료형)...params형식으로 사용

public class VariableArgsTest {
    public static void main(String[] args) {
        VariableArgsTest vt = new VariableArgsTest();
        vt.variableArgs(1, 2, 3); // 6
        vt.variableArgs(1, 2, 3, 4, 5); // 15
        vt.variableArgs(1, 2); // 3
    }

    public void variableArgs(int... params) {
        int sum = 0;
        for (int i : params) {
            sum += i;
        }
        System.out.println(sum);
    }

}

 

 

 

 

오버로딩

- 동일한 기능(이름)을 가진 메서드를 타입이나 매개변수를 다르게 하여 추가 작성하는 것

- 명시를 확실하게 하지 않으면 에러가 발생

#1: 동일 클래스, 동일 이름으로 구성할 것

#2: 전달 인자의 개수와 타입은 다르게 설정할 것

#3: 반환 타입과 접근 제한자는 상관 없음

 

 

 

 

 

생성자

- 객체가 생성될 때 자동으로 호출되는 특수 목적의 멤버함수로 객체를 초기화시켜주는 것이 목적

- 생성자는 클래스의 이름과 동일해야 한다.

- 반환 타입이 없으며, 매개변수 조건에 따라 여러 개를 작성할 수 있다.(반환 타입이 있으면 메서드가 되어버린다.-> 에러 안 뜸)

- 클래스에 최소 1개는 존재해야 하며, 따로 만들지 않는다면 컴파일러가 기본 생성자를 자동으로 만들어준다.

* 단 생성자 코드를 만드는 순간, 기본 생성자는 없어지게 되므로 기본 생성자도 같이 만들어 줘야 한다.

 

 

 

 

This

- 참조 변수로서 객체 자신을 가리킴 -> 인스턴스화된 객체에서 사용

- 자기 자신 클래스에 있는 멤버를 찾아감 -> 없으면 부모 클래스도 찾아가 봄

- 주로 지역 변수와 멤버 변수의 이름이 같을 때, 맴버 변수임을 명시적으로 표현하기 위해 사용

- Static으로 선언된 함수에서는 사용이 불가능하다(Main함수 같은 거)

 

-> 생성자의 오버로딩은 이름 대신 this를 사용한다. this는 생성자의 첫 줄에만 사용

 

 

 

'Java' 카테고리의 다른 글

6. 코드 외 작성할 것들  (0) 2024.07.17
5. 상속  (0) 2024.07.17
3. 자료구조  (0) 2024.07.15
2. 변수  (0) 2024.07.15
1. 자바 입문 + 꿀팁?  (0) 2024.07.10
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.