본문 바로가기

Java

Java 클래스와 메서드, 객체 (Class, Object, Method)

클래스와 메서드는 Java의 객체지향 프로그래밍(OOP)에서 핵심적인 구성 요소이다.

클래스는 객체를 생성하기 위한 청사진(템플릿)이고, 메서드는 클래스 내에서 수행할 작업(기능)을 정의한다.

 

Class (클래스)

클래스는 객체의 속성(필드)과 동작(메서드)을 정의하는 틀이다.

Java 프로그램은 클래스 단위로 작성되며, 클래스는 객체를 생성하기 위한 템플릿 역할을 한다.

 

클래스는 크게 네 가지 요소로 구성된다.

 

  • 필드 (Fields): 객체의 속성을 정의 (변수).
  • 메서드 (Methods): 객체의 동작(기능)을 정의 (함수).
  • 생성자 (Constructors): 객체를 초기화하는 특별한 메서드.
  • 내부 클래스 (Inner Classes): 클래스 내부에 정의된 클래스.

 

 

 

클래스는 다음과 같은 특징을 가지고 있다.

  1. 캡슐화 (Encapsulation): 데이터(필드)와 동작(메서드)을 묶어 외부로부터 보호.
  2. 재사용성: 한 번 정의된 클래스를 여러 곳에서 사용 가능.
  3. 추상화 (Abstraction): 객체의 복잡한 동작을 숨기고 필요한 부분만 노출.
  4. 상속 (Inheritance): 기존 클래스의 속성과 동작을 확장 가능.
  5. 다형성 (Polymorphism): 같은 이름의 메서드가 다양한 방식으로 동작.

 

클래스 선언

클래스는 class 키워드를 사용하여 선언된다.

public class ClassName {
    // 필드 (Field)
    데이터형 변수명;

    // 생성자 (Constructor)
    public ClassName() {
        // 초기화 코드
    }

    // 메서드 (Method)
    반환형 메서드명(매개변수) {
        // 메서드 동작 정의
    }
}

 

 

  • 필드 (Fields)
    • 클래스의 데이터를 저장하는 변수.
    • 예: int age;, String name;.

  • 메서드 (Methods)
    • 객체의 동작을 구현하는 함수.
    • 예: void walk(), int add(int a, int b).

  • 생성자 (Constructors)
    • 객체를 초기화하는 특별한 메서드.
    • 반환형이 없으며, 클래스 이름과 동일해야 함.
    • 오버로딩 가능: 여러 생성자를 정의하여 다양한 방식으로 객체 초기화 가능.

  • 접근 제한자 (Access Modifiers)
    • public, private, protected, default (패키지 프라이빗).
    • 클래스, 필드, 메서드의 접근 범위를 제한.

 

 

 

클래스 예제

기본 클래스

public class Person {
    // 필드
    private String name;
    private int age;

    // 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 메서드
    public void introduce() {
        System.out.println("Hi, I'm " + name + " and I'm " + age + " years old.");
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age > 0) {
            this.age = age;
        }
    }
}

 

 

객체 생성 및 사용

public class Main {
    public static void main(String[] args) {
        // 객체 생성
        Person person = new Person("Alice", 30);

        // 메서드 호출
        person.introduce(); // 출력: Hi, I'm Alice and I'm 30 years old.

        // 값 변경
        person.setAge(35);
        System.out.println("Updated Age: " + person.getAge()); // 출력: Updated Age: 35
    }
}

 

 

 

클래스의 종류

1. 일반 클래스 (reqular class)

가장 기본적인 형태의 클래스

 

2. 추상 클래스 (Abstract Class)

 

  • abstract 키워드를 사용.
  • 객체를 생성할 수 없으며, 상속을 통해서만 사용.
  • 추상 메서드(구현되지 않은 메서드)를 포함할 수 있음.
abstract class Animal {
    abstract void sound(); // 추상 메서드
    public void eat() {
        System.out.println("This animal eats food.");
    }
}
class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("Bark!");
    }
}

 

 

 

인터페이스 (Interface)

 

  • interface 키워드를 사용.
  • 모든 메서드는 암묵적으로 public abstract.
  • 다중 상속을 지원.
interface Flyable {
    void fly();
}
class Bird implements Flyable {
    @Override
    public void fly() {
        System.out.println("Bird is flying.");
    }
}

 

 

 

내부 클래스 (Inner Class)

 

  • 클래스 내부에 정의된 클래스.
  • 외부 클래스와 밀접한 관계가 있을 때 사용.
class OuterClass {
    class InnerClass {
        void display() {
            System.out.println("Inner class method.");
        }
    }
}

 

 

 

클래스 상속

상속의 개념

  • extends 키워드를 사용하여 부모 클래스의 속성과 메서드를 상속.
  • 부모 클래스의 기능을 재사용하거나 확장 가능.
class Vehicle {
    public void start() {
        System.out.println("Vehicle is starting.");
    }
}
class Car extends Vehicle {
    @Override
    public void start() {
        System.out.println("Car is starting.");
    }
}

 

객체 생성 및 사용

Car car = new Car();
car.start(); // 출력: Car is starting.

 


 

Object (객체)

객체는 클래스의 인스턴스로, 프로그램에서 실질적으로 사용되는 데이터와 동작을 나타내는 실체이다.

객체를 생성하면 클래스에 정의된 속성과 메서드를 사용할 수 있다.

 

  • 클래스: 객체를 생성하기 위한 설계도.
  • 객체: 클래스를 기반으로 생성된 메모리 상의 실체.
클래스 객체
설계도(청사진) 역할. 클래스를 기반으로 생성된 실체.
메모리에 로드되지 않음. 메모리(Heap)에 저장됨.
하나만 정의되면 여러 객체 생성 가능. 각각 독립적으로 메모리에 존재.

 

 

객체는 상태(속성)와 동작(메서드)로 구성된다.

 

  • 상태 (State):
    • 객체의 데이터를 나타내는 속성.
    • 클래스에서 정의된 **필드(Field)**를 통해 표현됩니다.
    • 예: 사람 객체에서 name = "Alice", age = 30 등.

  • 동작 (Behavior):
    • 객체가 수행할 수 있는 기능.
    • 클래스에서 정의된 **메서드(Method)**를 통해 구현됩니다.
    • 예: 사람 객체에서 walk(), talk() 등.

 

 

 

객체 생성

new 키워드를 사용하여 객체를 생성한다.

Car myCar = new Car("Toyota", 0);
myCar.accelerate();
myCar.showInfo();

 

 

기본 문법

ClassName objectName = new ClassName();

 

 

예제

// 클래스 정의
public class Person {
    String name;
    int age;

    void introduce() {
        System.out.println("Hi, I'm " + name + " and I'm " + age + " years old.");
    }
}

// 객체 생성 및 사용
public class Main {
    public static void main(String[] args) {
        // 객체 생성
        Person person = new Person();

        // 객체 필드 초기화
        person.name = "Alice";
        person.age = 30;

        // 객체 메서드 호출
        person.introduce(); // 출력: Hi, I'm Alice and I'm 30 years old.
    }
}

 

 

 

객체의 메모리 구조

객체는 Heap 영역에 저장된다.

  1. Heap 영역:
    • 객체와 객체의 필드가 저장되는 공간.
    • new 키워드로 생성된 객체가 할당됨.

  2. Stack 영역:
    • 참조 변수(객체의 주소를 저장)가 저장되는 공간.

 

Person person = new Person();

 

  • Stack: person이라는 참조 변수가 객체의 주소를 가짐.
  • Heap: new Person()으로 생성된 객체가 메모리에 저장됨.

 

 

객체의 주요 특징

유일성 (Identity)

  • 객체는 메모리 상에서 고유한 주소를 가진다.
  • == 연산자를 사용하면 메모리 주소를 비교한다.
Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1 == p2); // 출력: false (다른 메모리 주소)

 

 

 

상태 (State)

  • 객체의 속성 값은 변할 수 있다.
person.name = "Bob"; // 상태 변경

 

 

행위 (Behavior)

  • 객체의 동작은 클래스에서 정의된 메서드를 호출함으로써 실행된다.
person.introduce(); // 동작 수행

 

 

 

객체의 활용

1) 다수의 객체 생성

클래스를 기반으로 여러 객체를 생성 가능.

Person person1 = new Person();
Person person2 = new Person();

person1.name = "Alice";
person2.name = "Bob";

 

 

2) 메서드를 통한 데이터 조작

person1.setName("Charlie"); // 메서드를 통해 속성 수정

 

 

3) 캡슐화와 접근 제한

객체의 필드에 직접 접근하지 못하도록 캡슐화 사용.

public class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

 

 

객체의 예제

자동차 클래스와 객체

// 자동차 클래스
public class Car {
    String brand;
    int speed;

    void accelerate() {
        speed += 10;
    }

    void brake() {
        speed -= 10;
    }
}

// 자동차 객체 생성 및 사용
public class Main {
    public static void main(String[] args) {
        Car car = new Car();

        car.brand = "Toyota";
        car.speed = 50;

        car.accelerate();
        System.out.println("Speed after accelerating: " + car.speed); // 출력: 60

        car.brake();
        System.out.println("Speed after braking: " + car.speed);     // 출력: 50
    }
}

 


 

Method (메서드)

메서드는 특정 작업을 수행하기 위한 코드 블록으로, Java에서 객체의 동작을 정의하는 데 사용된다.

 

메서드는 코드의 재사용성을 높이고, 프로그램의 가독성을 개선하고,

입력값(매개변수)을 받아 처리한 후 결과값을 반환하거나 작업을 수행한다.

 

 

 

메서드의 기본 구성

 

  • 메서드 선언 (Method Declaration): 메서드의 이름, 반환 타입, 매개변수, 접근 제어자 등을 정의한다.
  • 메서드 구현 (Method Body): 메서드가 수행할 작업을 정의한다.

 

기본 문법

[접근 제어자] [반환 타입] 메서드명(매개변수 리스트) {
    // 메서드 바디 (작업 수행)
    return 반환값; // 반환 타입이 void인 경우 생략 가능
}

 

 

예제

public int add(int a, int b) {
    return a + b;
}

 

 

 

 

  • 접근 제어자 (Access Modifier)
    • 메서드의 접근 범위를 결정한다.
    • 종류: public, protected, default(생략), private.

  • 반환 타입 (Return Type)
    • 메서드가 반환하는 데이터의 타입을 지정한다.
    • void: 반환값이 없는 경우.

  • 메서드 이름 (Method Name)
    • 메서드를 호출할 때 사용하는 이름.
    • 명명 규칙: 소문자로 시작하며, 카멜케이스를 따른다 (e.g., calculateTotal).

  • 매개변수 (Parameter List)
    • 메서드에 전달된 데이터를 받을 변수 목록.
    • 매개변수가 없는 메서드는 빈 괄호 () 사용.

  • 메서드 바디 (Method Body)
    • 메서드의 실행 로직이 포함된 부분.

  • return 키워드
    • 메서드 실행 결과를 호출자에게 반환.
    • void 메서드에서는 생략 가능.

 

 

메서드의 종류

1) 인스턴스 메서드

객체를 통해 호출하며, 인스턴스 변수에 접근 가능하다.

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calc = new Calculator();
        System.out.println(calc.add(5, 3)); // 출력: 8
    }
}

 

 

 

2) 클래스(정적) 메서드

클래스 이름을 통해 호출하며, 인스턴스 변수에 접근할 수 없다. (static 키워드 사용)

public class MathUtils {
    public static int multiply(int a, int b) {
        return a * b;
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println(MathUtils.multiply(4, 5)); // 출력: 20
    }
}

 

 

3) Getter와 Setter

객체의 속성 값을 읽거나 변경하는 데 사용한다.

public class Person {
    private String name;

    public String getName() { // Getter
        return name;
    }

    public void setName(String name) { // Setter
        this.name = name;
    }
}

 

 

4) 생성자 (Constructor)

클래스의 인스턴스가 생성될 때 호출되는 특별한 메서드이다.

반환 타입이 없으며, 클래스 이름과 동일하다.

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }
}

 

 

 

메서드 오버로딩 (Overloading)

같은 이름의 메서드를 매개변수의 개수타입이 다르게 정의한다.

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public double add(double a, double b) {
        return a + b;
    }
}

 

 

 

메서드 오버라이딩 (Overriding)

상위 클래스의 메서드를 하위 클래스에서 재정의한다.

 

  • 메서드 이름, 매개변수, 반환 타입이 동일해야 함.
  • 접근 제어자는 더 넓은 범위로만 변경 가능.
public class Animal {
    public void sound() {
        System.out.println("Animal makes a sound");
    }
}

public class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Dog barks");
    }
}

 

 

 

예제

public class BankAccount {
    private double balance;

    // 생성자
    public BankAccount(double initialBalance) {
        balance = initialBalance;
    }

    // 입금 메서드
    public void deposit(double amount) {
        balance += amount;
    }

    // 출금 메서드
    public void withdraw(double amount) {
        if (balance >= amount) {
            balance -= amount;
        } else {
            System.out.println("Insufficient funds!");
        }
    }

    // 잔액 확인 메서드
    public double getBalance() {
        return balance;
    }
}

// 메인 클래스
public class Main {
    public static void main(String[] args) {
        BankAccount account = new BankAccount(1000);

        account.deposit(500);    // 500 입금
        account.withdraw(300);  // 300 출금
        System.out.println(account.getBalance()); // 출력: 1200
    }
}

 


 

클래스와 메서드의 접근 제한자

접근 제한자 클래스 내부 같은 패키지 하위 클래스 다른 패키지
public O O O O
protected O O O X
default O O X X
private O X X X

 

public class Example {
    private int value; // 외부 접근 불가

    public int getValue() {
        return value; // 외부에서 접근 가능
    }

    public void setValue(int value) {
        this.value = value;
    }
}

'Java' 카테고리의 다른 글

Java 람다식 (Lambda Expression)  (0) 2024.11.18
Java 캡슐화 (Encapsulation)  (0) 2024.11.17
Java 반복문 (for, while, do while, 다중 반복문)  (1) 2024.11.15
Java 조건문 (if, if else, switch case)  (0) 2024.11.14
Java 문자열 (String)  (1) 2024.11.14