Java 자바의 기초 (클래스, 객체, 인스턴스, 생성자, 패키지)

개발일지

이번 주는 자바의 기초를 더 깊게 공부하면서 객체 지향 프로그래밍에 대한 이해를 높일 수 있었습니다. 좋은 객체 지향 코드를 작성하는 방법에 대해 알게 되었던 한 주였습니다. 기본 개념을 탄탄히 다지는 것이 중요하다는 것을 알기에 열심히 공부 중입니다. 이렇게 개발일지가 쌓이다 보면 나중에는 좋은 코드들로 기능을 소개하는 날이 올 것이라 믿습니다.

이번주에 학습한 내용들을 간단하게 정리해보려 합니다. 이번 개발일지에 올릴 내용은 클래스, 객체, 인스턴스, 생성자, 패키지 입니다.

클래스

클래스를 이해하기 쉽게 비유하면, 설계 도면이나 템플릿과 유사합니다. 이를 통해 여러 개의 유사한 물건(객체)을 만들 수 있습니다. 예를 들면, 집을 지을 때 사용하는 설계 도면과 유사합니다. 이 도면을 기반으로 여러 집들을 건설할 수 있습니다.

다시 말해, 클래스는 일종의 설계도로서, 데이터와 그 데이터를 다루기 위한 메서드들을 담고 있습니다. 이런 클래스를 사용하여 객체(인스턴스)를 생성하면, 마치 설계도를 기반으로 실제 물건을 만들어내듯이 프로그램에서 여러 개의 객체를 만들어 낼 수 있습니다.

예시로 보면, 집을 만들 때 사용하는 설계도(클래스)는 다양한 특성을 가질 수 있습니다. 예를 들어, 방의 크기, 색상, 문의 위치 등이 클래스의 멤버 변수에 해당하며, 각 방을 꾸미거나 문을 열고 닫는 행위는 클래스의 메서드에 해당합니다.

이러한 클래스와 객체의 관계를 비유로 설명하면, 설계도(클래스)를 기반으로 여러 개의 집(객체)을 지을 수 있다는 개념을 이해하는 데 도움이 될 것입니다.

자바에서 클래스는 데이터와 해당 데이터를 처리하는 메서드를 포함하는 사용자 정의 데이터 타입 입니다. 클래스는 객체를 생성하기 위한 템플릿 역할을 하며, 객체는 클래스의 인스턴스입니다.

클래스의 구조

클래스는 class 키워드를 사용하여 정의됩니다. 클래스 이름은 대문자로 시작하며, 관례적으로 카멜 표기법을 사용합니다. 클래스 내부에는 멤버 변수(속성)와 메서드(동작)를 정의할 수 있습니다.

Java
public class MyClass {
    // 멤버 변수
    private int myVariable;

    // 메서드
    public void myMethod() {
        // 메서드의 구현 내용
    }
}
Java

접근 제어자

멤버 변수와 메서드에는 접근 제어자를사용하여 접근 권한을 지정할 수 있습니다. public, private, protected, 디폴트 등이 있습니다.

인스턴스 생성

클래스를 기반으로 객체(인스턴스)를 생성하기 위해서는 new 키워드를 사용합니다.

Java
MyClass myObject = new MyClass();
Java

생성자(Constructor)

클래스는 생성자를 가질 수 있습니다. 생성자는 객체를 초기화하는 역할을 합니다.

Java
public class MyClass {
    private int myVariable;

    // 생성자
    public MyClass(int initialValue) {
        this.myVariable = initialValue;
    }
}
Java

상속(Inheritance)

클래스는 다른 클래스를 확장하여 새로운 클래스를 만들 수 있습니다. 이를 통해 코드 재사용성이 높아지고, 계층 구조를 형성할 수 있습니다.

Java
public class ChildClass extends ParentClass {
    // 자식 클래스의 멤버나 메서드 정의
}
Java

다형성(Polymorphism)

다형성은 하나의 인터페이스나 클래스가 여러 형태로 동작할 수 있는 능력을 의미합니다. 이는 오버로딩(Overloading)과 오버라이딩(Overriding)을 통해 구현됩니다.

Java
// 오버로딩
public void myMethod(int value) {
    // 구현 내용
}

public void myMethod(String text) {
    // 구현 내용
}

// 오버라이딩
@Override
public void parentMethod() {
    // 자식 클래스에서 재정의된 내용
}
Java

객체

자바에서 클래스와 객체는 객체 지향 프로그래밍(OOP)의 기본 요소입니다. 클래스는 객체를 생성하기 위한 템플릿이고, 객체는 클래스의 인스턴스입니다.

클래스와 객체의 관계

클래스는 데이터(속성)와 행동(메서드)을 정의하는 틀이며, 객체는 이 틀을 기반으로 실제로 생성된 것입니다. 클래스는 설계도와 같고, 객체는 그 설계도를 바탕으로 만들어진 실체입니다.

Java
// 클래스 정의
public class Dog {
    // 멤버 변수(속성)
    String name;
    int age;

    // 메서드(행동)
    void bark() {
        System.out.println("Woof, woof!");
    }
}

// 객체 생성
Dog myDog = new Dog();
Java

객체의 속성과 메서드

객체는 클래스에서 정의된 속성(멤버 변수)과 행동(메서드)을 가지고 있습니다. 위의 예제에서 name과 age는 Dog 클래스의 멤버 변수(속성)이며, bark()는 해당 클래스의 메서드입니다.

객체의 생성과 사용

객체를 생성하기 위해서는 new 키워드를 사용합니다. 생성된 객체는 클래스의 인스턴스로서, 해당 클래스에 정의된 속성과 메서드를 사용할 수 있습니다.

Java
// 객체 생성
Dog myDog = new Dog();

// 객체의 속성 설정
myDog.name = "Buddy";
myDog.age = 3;

// 객체의 메서드 호출
myDog.bark();
Java

다수의 객체 생성

하나의 클래스를 기반으로 여러 객체를 생성할 수 있습니다. 각각의 객체는 독립적으로 존재하며, 서로 다른 상태를 가질 수 있습니다.

Java
Dog dog1 = new Dog();
Dog dog2 = new Dog();

dog1.name = "Max";
dog2.name = "Lucy";

dog1.bark(); // Max가 짖습니다.
dog2.bark(); // Lucy가 짖습니다.
Java

인스턴스

자바에서 “인스턴스(Instance)”란 클래스의 객체를 의미합니다. 클래스는 객체를 만들기 위한 템플릿이며, 이 템플릿을 기반으로 실제 데이터를 가지고 있는 객체를 생성할 수 있습니다. 이렇게 생성된 객체를 우리는 해당 클래스의 “인스턴스”라고 부릅니다.

인스턴스는 클래스의 정의를 기반으로 생성되며, 각각의 인스턴스는 독립적인 메모리 공간을 가지고 있습니다. 따라서 하나의 클래스로부터 여러 개의 인스턴스를 생성하여 서로 다른 데이터를 가지고 있는 객체들을 만들 수 있습니다.

예를 들어, Car 클래스가 있다면, 이 클래스를 기반으로 생성된 실제 자동차 객체가 각각의 인스턴스가 됩니다.

Java
public class Car {
    String model;
    String color;

    void start() {
        System.out.println("자동차가 출발합니다.");
    }
}

// Car 클래스를 기반으로 두 개의 인스턴스를 생성
Car myCar1 = new Car();
myCar1.model = "Sedan";
myCar1.color = "Blue";

Car myCar2 = new Car();
myCar2.model = "SUV";
myCar2.color = "Black";
Java

위의 코드에서 myCar1과 myCar2는 각각 Car 클래스의 인스턴스입니다. 이 두 인스턴스는 같은 클래스를 기반으로 생성되었지만, 서로 다른 데이터를 가지고 있습니다. 이러한 인스턴스화를 통해 클래스의 구조를 공유하면서도 각 객체가 독립적으로 작동할 수 있습니다.

인스턴스는 클래스의 멤버 변수를 사용하여 데이터를 저장하고, 클래스의 메서드를 호출하여 특정 동작을 수행할 수 있는데, 이것이 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다.

생성자

자바에서 생성자(Constructor)는 클래스의 인스턴스를 만들 때 호출되는 특별한 종류의 메서드입니다. 생성자의 주요 목적은 객체를 초기화하는 것이며, 객체가 생성될 때 필요한 초기 설정을 제공합니다. 클래스 내부에 생성자를 정의하면, 객체를 생성하는 동시에 필요한 작업을 수행할 수 있습니다.

형태

생성자는 클래스의 이름과 동일하며, 메서드처럼 보이지만 반환 타입이 없습니다. 예를 들어, 클래스 이름이 MyClass이면 생성자의 이름도 MyClass가 됩니다.

Java
public class MyClass {
    // 기본 생성자
    public MyClass() {
        // 생성자의 구현 내용
    }

    // 매개변수가 있는 생성자
    public MyClass(int value) {
        // 생성자의 구현 내용
    }
}
Java

기본 생성자(Default Constructor)

클래스에 명시적으로 생성자를 작성하지 않으면 기본 생성자가 자동으로 생성됩니다. 기본 생성자는 매개변수가 없고, 아무 동작도 수행하지 않는 형태입니다.

Java
public class MyClass {
    // 기본 생성자 (자동으로 생성됨)
    public MyClass() {
        // 아무 동작도 수행하지 않음
    }
}
Java

매개변수가 있는 생성자

필요에 따라 매개변수를 받아 객체를 생성하는 생성자를 정의할 수 있습니다. 이를 통해 객체를 생성할 때 초기값을 전달할 수 있습니다.

Java
public class MyClass {
    private int myVariable;

    // 매개변수가 있는 생성자
    public MyClass(int initialValue) {
        this.myVariable = initialValue;
    }
}
Java

생성자 오버로딩

여러 개의 생성자를 정의하여 다양한 초기화 방법을 제공할 수 있습니다. 이를 생성자 오버로딩이라고 합니다.

Java
public class MyClass {
    private int myVariable;

    // 기본 생성자
    public MyClass() {
        // 아무 동작도 수행하지 않음
    }

    // 매개변수가 있는 생성자
    public MyClass(int initialValue) {
        this.myVariable = initialValue;
    }
}
Java

this 키워드

생성자 내에서 멤버 변수와 생성자의 매개변수가 동일한 이름을 가질때, this 키워드를 사용하여 현재 인스턴스의 멤버 변수임을 명시할 수 있습니다.

Java
public class MyClass {
    private int myVariable;

    // 매개변수가 있는 생성자
    public MyClass(int myVariable) {
        this.myVariable = myVariable; // this를 사용하여 멤버 변수에 접근
    }
}
Java

생성자는 객체의 초기화 작업을 효과적으로 수행할 수 있도록 합니다. 객체 생성 시에 필요한 데이터를 전달하거나, 기본값으로 초기화하는 등의 작업을 생성자를 통해 수행할 수 있습니다.

패키지

자바에서 패키지(Package)는 클래스들을 그룹화하고 정리하는 데 사용되는 디렉토리 구조를 나타냅니다. 패키지는 클래스의 이름 충돌을 방지하고, 코드를 모듈화하여 유지보수성을 높이며, 관련된 클래스들을 논리적으로 묶어서 구조화하는데 도움을 줍니다.

패키지의 주요 특징과 사용 방법은 다음과 같습니다.

패키지 선언

클래스 파일의 맨 위에 패키지를 선언합니다. 패키지 선언은 소스 파일의 첫 줄에 위치하며, 패키지 이름은 일반적으로 도메인 이름을 역순으로 사용합니다.

// 패키지 선언
package com.example.myproject;

// 클래스 정의
public class MyClass {
    // 클래스 내용
}

하위 패키지

패키지 내에 더 많은 하위 패키지를 생성할 수 있습니다. 이를 통해 클래스들을 더 세분화하고 구조화할 수 있습니다.

// 상위 패키지 선언
package com.example.myproject;

// 하위 패키지 선언
package com.example.myproject.utilities;

// 클래스 정의
public class UtilityClass {
    // 클래스 내용
}

Import문

다른 패키지에 속한 클래스를 사용할 때 import 문을 사용합니다. 이를 통해 패키지 경로를 생략하고 클래스를 직접 사용할 수 있습니다.

// 패키지 선언
package com.example.myproject;

// 다른 패키지의 클래스 import
import com.example.myproject.utilities.UtilityClass;

public class MyClass {
    public static void main(String[] args) {
        // 다른 패키지의 클래스 사용
        UtilityClass utility = new UtilityClass();
    }
}

디렉토리 구조

패키지는 소스 코드를 저장하는 디렉토리 구조와 일치해야 합니다. 패키지명이 com.example.myproject이면, 해당 패키지의 클래스 파일은 com/example/myproject 디렉토리에 저장되어야 합니다.

접근 제어자

패키지 내에서 클래스에 대한 접근을 제어하기 위해 접근 제어자를 사용할 수 있습니다. public, protected, 디폴트, private 등의 접근 제어자를 활용하여 클래스의 가시성을 조절할 수 있습니다.

마무리

이번 글에서는 클래스, 객체, 인스턴스, 생성자, 패키지에 대해 중요한 내용 위주로 작성해 보았습니다.

클래스는 마치 설계 도면이나 템플릿으로, 객체를 만들기 위한 틀을 제공합니다. 객체는 클래스의 인스턴스로, 클래스를 기반으로 생성된 실제 데이터를 가지고 있는 것입니다. 클래스와 객체의 관계를 집을 짓는 과정으로 비유해서 이해하는 것이 도움이 되었습니다.

생성자는 객체를 초기화하는 역할을 하며, 객체가 생성될 때 필요한 작업을 수행합니다. 기본 생성자와 매개변수가 있는 생성자 등 다양한 형태를 가질 수 있습니다.

패키지는 클래스들을 그룹화하고 정리하여 코드를 모듈화하고 구조화하는 데 사용됩니다. 패키지를 통해 클래스의 이름 충돌을 방지하고 코드를 논리적으로 묶을 수 있습니다.

이번 주에 학습한 내용을 토대로, 나중에는 더욱 복잡하고 유지보수가 쉬운 프로그램을 개발할 수 있을 것으로 기대합니다. 열심히 학습하고 노력하는 과정이 미래의 성공을 이끌어낼 것입니다. 훌륭한 프로그래머가 되기 위해 더욱 열심히 달려보겠습니다.🚀

Leave a Comment