[JAVA] 6.1 클래스-1

redcarrot01·2021년 5월 4일
0

JAVA

목록 보기
6/9
post-thumbnail

6. 클래스

6.1 객체 지향 프로그래밍

객체

물리적으로 존재 or 추상적으로 생각할 수 있는 것 중,

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

객체는 속성과 동작으로 구성되어 있음

자바 :: 속성 => 필드 , 동작 => 메소드

객체의 상호 작용

// 객체 간의 메소드 호출하기
// 매개값 10, 20으로 Calculator 객체의 add 메소드 호출. result 변수에 결과값(리턴값) 저장
int result = Calculator.add(10, 20);

객체의 상호작용은 객체 간의 메소드 호출을 의미, 매개값과 리턴값을 통해 데이터 주고 받음

객체와 클래스

클래스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.

인스턴스는 클래스로부터 만들어진 객체이다.

클래스 선언

클래스명 예시

Caculator, Car, Member, ChatClient, ChatServer, Web_Browser
public class Car {
    
}
class Tire{
    
}
  • 소스 파일(.java)은 클래스 선언을 담고 있는 저장 단위일 뿐, 클래스 자체가 아니다. 만약 한 소스 파일 안에 두 개의 클래스를 선언하고 컴파일한다면 두 개의 바이트 코드 파일(.class)이 생긴다.

  • 2개 이상의 클래스 선언도 가능한데, public 접근 제한자는 파일 이름과 동일한 이름의 클래스 선언에만 붙일 수 있다.

  • 가급적, 소스 파일 하나당 동일한 이름의 클래스 하나를 선언하는 것이 좋다.

객체 생성과 클래스 변수

// 클래스 변수에 new 연산자가 리턴한 객체의 번지를 저장하는 코드
클래스 변수 = new 클래스();

new는 클래스로부터 객체를 생성시키는 연산자이다.

new 연산자로 생성된 객체는 메모리 힙 영역에 생성된다.

같은 클래스로 객체를 두 개 생성했다면, 각각의 객체는 완전히 독립된 서로 다른 객체이다.

라이브러리 클래스

API(Application Program Interface) 용으로 다른 클래스에서 이용할 목적으로 설계된 클래스(Student 클래스, Car 클래스...)

실행 클래스

프로그램의 실행 진입점인 main() 메소드를 제공하는 클래스

클래스의 구성 멤버

필드(Field)

객체의 데이터가 저장되는 곳

객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳

필드는 변수가 아니다

변수는 생성자와 메소드 내에서만 사용되고 소멸됨, 필드는 객체가 소멸되기전까지 사용

생성자(Constructor)

객체 생성 시 초기화 역할 담당

new 연산자로부터 호출되는 중괄호 블록

메소드와 비슷하지만 클래스 이름으로 되어 있고 리턴 타입이 없다.

메소드(Method)

객체의 동작에 해당하는 실행 블록

객체 간에 데이터 전달하는 수단

외부로부터 매개값을 받아 실행에 이용하고 실행 후 결과 값을 외부로 리턴하기도 함

6. 2 필드

필드 선언

String color = "검정";
int maxSpeed;

초기값은 생략 가능하다. 초기값이 지정되지 않았다면, 기본 초기값을 설정

정수 타입은 0, 실수 타입은 0.0, beelean 타입은 false로 초기화,

참조 타입(배열, 클래스, 인터페이스)은 null로 초기화

필드 사용

클래스 외부에서 필드를 사용할 경우, 클래스로부터 객체 생성 뒤에 필드 사용해야 한다.

그 이유는 필드가 객체에 소속된 데이터이므로, 객체가 존재하지 않으면 필드도 존재하지 않는다.

도트연산자

myCar.speed = 60;

도트연산자는 객체 접근 연산자로, 객체가 가지고 있는 필드나 메소드 사용하고자 할 때 사용

public class Car {
    String company = "현대자동차";
    String model = "그랜저";
    String color = "검정";
    int maxSpeed = 350;
    int speed;
}
public class CarExample {
    public static void main(String[] args) {
		Car myCar = new Car();
		System.out.println("제작회사: " + myCar.company);
        System.out.println("기본속도: " + myCar.speed);
        myCar.speed = 60;
        System.out.println("수정속도: " + myCar.speed);
    }
}
제작회사 : 현대자동차
기본속도 : 0
수정속도 : 60

6.3 생성자

생성자

new 연산자로 호출되며, 객체 생성 시 초기화 담당

객체 초기화

필드 초기화, 메소드 호출해서 객체 사용할 준비 하는 것.

생성자를 실행하지 않고는 클래스로부터 객체 만들 수 없음

기본 생성자

모든 클래스는 생성자가 반드시 존재하며, 생성자를 하나 이상 가질 수 있다.

클래스 내부에 생성자 선언을 생략했다면 컴파일러는 기본 생성자를 바이트 코드에 자동으로 추가한다.

  • 생성자 생략하면 기본 생성자 다음과 같이 생성됨
// Car.java (소스 파일)
public class Car {  
}
 
-> 컴파일 결과 아래

// Car.class (바이트 코드 파일)
public class Car {
    // 기본 생성자
    public Car() { }
}

명시적으로 생성자를 선언했다면 컴파일러는 기본 생성자를 추가하지 않는다.

(명시적) 생성자 선언

public class Car {
    // 생성자 선언
    Car(String color, int cc) {
    }
}
public class CarExample {
    public static void main(String[] args) {
        Car myCar = new Car("검정", 3000);
        //Car myCar = new Car();// 기본 생성자 호출 불가능
    }
}

필드 초기화

초기화 방법 2가지

  1. 필드 선언할 때 초기값 주는 법
  2. 생성자에게 초기값 주는 법
  • 생성자에서 필드 초기화(2번 방법)
public class Korean {
    String nation = "대한민국";
    String name;
    String ssn;
    
    public Korean(String name, String ssn) { // name, ssn은 매개변수
        this.name = name;
        this.ssn = ssn;
    }
}
// ("박자바", "011225-1234567")는 name 필드와 ssn 필드의 초기값으로 사용
Korean k1 = new Korean("박자바", "011225-1234567");

필드와 동일한 이름의 매개변수 사용을 위해 this를 사용

그 이유는, 매개변수가 사용 우선순위가 더 높기 때문

필드 앞에 this. 쓰기 -> this는 객체 자신을 참조한다는 의미

this.name = name; // 앞에 name 필드, 뒤에 name 매개변수임

생성자 오버로딩

생성자 오버로딩 : 매개 변수가 다른 생성자를 여러 개 선언하는 것

public class Car {
    Car() { ... }
    Car(String model) { ... }
    Car(String model, String color) { ... }
    Car(String model, String color, int maxSpeed) { ... }
}

매개 변수의 타입과 개수, 선언 순서가 똑같을 경우에는 매개 변수의 이름이 달라도 생성자 오버로딩이 아님

다른 생성자 호출 : this()

생성자 간의 중복된 코드를 줄일 수 있는 방법

this()는 자신의 다른 생성자를 호출하는 코드로, 생성자의 첫 줄에서만 허용

public class Car {
    String company = "현대자동차";
    String model;
    String color;
    int maxSpeed;
    
    Car() {}
    
    Car(String model) {
        this(model, "은색", 250);
    }
    
    Car(String model, String color) {
        this(model, color, 250);
    }
    
    Car(String model, Strign color, int maxSpeed) {
        // 공통 실행 코드
        this.model = model;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
}

관심 있을 만한 포스트

0개의 댓글