자바(JAVA)/미니 프로젝트 & 기초 공부

Java 기초 또 다시 공부하기 9일차 - 객체 지향 프로그래밍(필드, 생성자, 메서드)

개발학생 2025. 6. 5. 18:56
반응형

1. 필드(Field)

1) 필드의 개념 및 선언

  • 개념: 객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 저장
  • 선언: 클래스 중관호 {} 블록 내부에 "타입 필드명( = 초기값);"과 같은 형식으로 선언
    -> 초기값 설정은 생략 가능 
String company = "당근";
String product = "플랫폼";
int num = 10;
int companyYear;
  • 초기값을 지정하지 않았을 경우 필드 타입별 기본 초기값 
타입 분류 타입 초기값
정수 타입 byte  0
char \u0000(빈 공백)
short 0
int 0
long 0L
실수 타입 float 0.0F
double 0.0
논리 타입 boolean false
참조 타입 배열 null
클래스(String 포함) null
인터페이스 null

2) 필드 사용(필드값을 읽고 변경)

  • 클래스 내부의 생성자나 메서드에서 사용 시 필드 이름으로 읽고 변경
  • 클래스 외부(다른 클래스)에서 사용 시, 외부에서 객체를 생성한 후 필드를 사용
    -> 필드가 객체에 소속된 데이터이므로, 객체가 존재하지 않으면 필드도 존재하지 않음 
// Car 클래스(Car.java)
class Car {
  // 필드
  int speed;
  
  // 생성자(값 변경)
  Car() {
    speed = 10;
  }
  
  // 메서드
  void method(...) {
    speed = 20;
  }
}
// Person 클래스(Car 클래스의 필드 사용, Person.java)
class Person {
  void method() {
    // Car 객체 생성
    Car car = new Car();
    // Car의 필드 사용
    car.speed = 60;
  }
}

2. 생성자(Constructor)

1) 생성자의 개념

  • new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체 초기화(필드 초기화 or 메서드 호출로 객체 사용 준비) 담당
  • new 연산자에 의해 생성자가 성공적으로 실행하면, 힙(heap) 영역에 객체가 생성되며 객체의 번지를 리턴함
    -> 리턴한 번지는 클래스 변수에 저장됨
  • 모든 클래스는 생성자가 반드시 존재하며, 생성자를 하나 이상 가질 수 있음

2) 기본 생성자(Default Constructor)

  • 클래스 내부에 생성자를 선언하지 않았다면,
    컴파일러는 아래처럼 중괄호 블록 내용이 비어 있는 형태로 기본 생성자를 바이트 코드에 자동으로 추가
class Car {
  Car() {
  }
}
  • 클래스에 생성자를 선언하지 않았어도 Car car = new Car();처럼 new 연산자 뒤에 기본 생성자를 호출하여 객체 생성 가능 

3) 생성자 선언

  • 기본 생성자 대신 사용할 생성자를 명시적으로 선언
    -> 아래 코드에 경우, Car 생성자를 호출할 때 Car car = new Car("그랜저", "파랑", 100);처럼 3개 매개값 사용
class Car {
  // 생성자
  Car(String model, String color, int speed) {
    ...;
    return ...;
  }
}

4) 생성자에서 필드 초기화 

class Car {
  String nation;
  String name;
  int speed;
  
  car(String nation, String name, int speed) {
    // 객체 자신의 필드에 매개 변수를 넣음
    this.nation = nation;
    this.name = name;
    this.speed = speed;
  }
}

5) 생성자 오버로딩(overloading)

  • 매개 변수를 달리하는 생성자를 여러 개 선언하는 것
  • 예시
class Car {
  Car() { ... }
  Car(String model) { ... }
  Car(String model, String nation) { ... }
  Car(String model, String nation, int speed) { ... }
}

3. 메서드(메소드, Method)

1) 메서드 선언

  • 메서드 선언부(=메서드 시그니처,signature)와 메서드 실행 블록으로 구성
    • 리턴 타입: 메서드가 리턴하는 결과의 타입 표시
    • 메서드 이름: 메서드의 기능이 드러나도록 식별자 규칙에 맞는 이름을 설정
    • 매개 변수 선언: 메서드를 실행할 때 필요한 데이터를 받기 위한 변수 선언
    • 메서드 실행 블록: 실행할 코드 작성
메서드리턴타입 메서드이름 (매개변수선언1, ...) {
  메서드 실행 블록
  ...
}

(1) 리턴 타입

  • 리턴값의 타입, 즉 메서드를 실행한 후의 결과값
  • 리턴 타입을 void로 설정할 경우 리턴값이 없음

(2) 메서드 이름

  • 숫자로 시작하면 안되며, $와 _를 제외한 특수 문자 사용 금지
  • 소문자로 작성하며, 어떤 기능을 하는지 동사형으로 작성하는 것이 관례
  • 두 단어 이상의 이름일 경우, 카멜 케이스(첫단어의 첫문자는 소문자, 다른단어의 첫문자는 대문자)로 작성
    -> 띄어쓰기 없이 이름을 짓기 위함

(3) 매개 변수 선언

  • 매개변수: 메서드 실행 시 필요한 데이터를 받기 위한 변수
    -> 필요한 경우도 있고, 필요 없는 경우도 있음 
  • 메서드의 매개 변수는 여러 타입을 포함 할 수 있으며, 메서드 호출 시 그에 해당하는 값을 반드시 모두 주어야 함
    -> 단, 매개 변수의 개수를 알 수 없다면 배열 타입으로 매개 변수를 선언
String plus(String x, int y) { ... }

String result = plus("문자열", 1);

(4) 리턴(return)문

  • 리턴값이 있는 메서드는 반드시 리턴문으로 리턴값 지정
  • 리턴값이 없는 메서드(void 타입)에서 return;을 사용하면 메서드 실행을 강제 종료함

2) 메서드 호출

(1) 객체(클래스) 내부에서 호출

class ClassName {
  void method1(String p, int q) {
    System.out.println(p + q);
  }
  
  void method2() {
   method1("문자열", 1);
  }
}

(2) 객체(클래스) 외부에서 호출

class Car {
  // 필드
  int speed;
  
  // 생성자(생략)
  
  // 메서드
  int getSpeed() {
    return speed;
  }
  
  void turnOn() {
    System.out.println("시동 걸기");
  }
  
  void run() {
    for(int i=10; i<=50; i+=10) {
      speed = i;
      System.out.println("시속 " + speed + "km/h으로 주행");
    }
  }
}
class Main {
  public static void main(String[] args) {
    Car car = new Car();
    car.turnOn();
    car.run();
    int speed = car.getSpeed();
    System.out.println("현재 속도: " + speed + "km/h");
  }
}
  • 실행 결과

객체(클래스) 외부에서 호출 예시

3) 메서드 오버로딩(overloading)

  • 클래스 내에 같은 리턴 타입과 이름의 메서드를 여러 개 선언
    -> 매개 변수의 타입, 개수, 순서가 다르면 됨
  • 매개값을 다양한게 받아 처리할 수 있도록 하기 위함

 

반응형