[Java] 클래스와 객체

rara_kim·2022년 6월 12일
0

Java

목록 보기
7/39
post-thumbnail

클래스와 객체

클래스(class)

자바에서 클래스(class)란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용된다.
자바에서는 이러한 설계도인 클래스를 가지고, 여러 객체를 생성하여 사용하게 된다.

클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성된다.
필드(field)는 클래스에 포함된 객체 변수를 의미하며, 메소드(method)는 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있다.

class Car {
    String name;
    String type;
}

Car car1 = new Car();   //객체 생성, 클래스의 인스턴스화

인스턴스(instace)

자바에서 클래스를 사용하기 위해서는 우선 해당 클래스 타입의 객체(object)를 선언해야 하는데, 이렇게 클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스화 라고 한다.
또한, 이렇게 선언된 해당 클래스 타입의 객체를 인스턴스(instance)라고 한다.
인스턴스란 메모리에 할당된 객체를 의미하며, 어떤 객체는 어떤 클래스의 인스턴스를 의미한다.


메소드(method)

메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이다.

접근제어자 반환타입 메소드이름(매개변수) {  //선언부
	//구현부 
}


//메소드 정의 예시
public void move() {
    System.out.println("이동!");
}

1️⃣접근 제어자 : 해당 메소드에 접근할 수 있는 범위를 명시

2️⃣반환타입(return type) : 메소드가 모든 작업을 마치고 반환하는 데이터의 타입을 명시

3️⃣메소드 이름: 메소드를 호출하기 위한 이름을 명시

4️⃣매개변수(parameters) : 메소드 호출 시에 전달되는 인수의 값을 저장할 변수들을 명시

5️⃣구현부 : 메소드의 고유 기능을 수행하는 명령문의 집합

자바에서는 하나의 클래스에 같은 이름의 메소드를 둘 이상 정의할 수 없다.
하지만 메소드 오버로딩(overloading)을 이용하면, 같은 이름의 메소드를 중복하여 정의할 수 있다.


생성자(Constructor)

자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자(constructor)라는 메소드를 제공한다.

생성자는 객체가 생성될 때 자동으로 호출된다.
생성자를 따로 정의하지 않으면 default 생성자가 있는 것으로 간주하며, 생성자를 따로 정의했다면 default 생성자를 사용하지 못하는데, 필요한 경우에는 생성자 오버로딩을 통해 따로 정의해야한다.

생성자는 클래스명과 이름이 같아야하며 리턴 타입이 없다.

💡생성자 특징
1. 생성자는 반환값이 없지만, 반환 타입을 void형으로 선언하지 않는다.
2. 생성자를 초기화를 위한 데이터를 인수로 전달받을 수 있다.
3. 객체를 초기화 하는 방법이 여러개 존재할 경우에는 하나의 클래스가 여러 개를 생성자를 가질 수 있다. 즉, 생성자도 하나의 메소드이므로, 메소드 오버로딩이 가능하다.

💡생성자 선언

class이름() {...}             //매개변수가 없는 생성자 선언
class이름(인수1, 인수2) {...}   //매개변수가 있는 생성자 선언

💡생성자 호출
자바에서는 new키워드를 사용하여 객체를 생성할 때 자동으로 생성자가 호출된다.

class Animal {
    String name;
    Double weight;
    String type;

    Animal() {}
    Animal(String name, Double weight, String type) {    //생성자 오버로딩
        this.name = name;       //객체 생성시 받아온 name을 자기 객체의 name으로 할당
        this.weight = weight;
        this.type = type;
        
 	public void printInfo() {
        System.out.println("name = " + name);
        System.out.println("weight = " + weight);
        System.out.println("type = " + type);
    }       
}


public class Practice {
    public static void main(String[] args) {
        Animal animal1 = new Animal("강아지", 5.0, "포유류");
        Animal animal2 = new Animal("구피", 0.01, "어류");
        
        animal1.printInfo();   //name = 강아지, weight = 5.0, type = 포유류
        animal2.printInfo();   //name = 구피, weight = 0.01, type = 어류
}

this, this()

1️⃣this
this 참조변수는 인스턴스가 자기 자신을 참조하는데 사용하는 변수이다.
이러한 this 참조변수는 해당 인스턴스의 주소를 가리킨다.

2️⃣this() 메소드
this() 메소드는 생성자 내부에서만 사용할 수 있으며, 같은 클래스의 오버로딩 된 다른 생성자를 호출할 때 사용한다.


오버로딩(overloading)

메소드 오버로딩(overloading)이란 같은 이름의 메소드를 중복하여 정의하는 것이다.

자바에서는 원래 한 클래스 내에 같은 이름의 메소드를 둘 이상 가질 수 없다.
하지만 매개변수의 개수나 타입을 다르게 하면, 하나의 이름으로 메소드를 작성할 수 있다.

즉, 메소드 오버로딩은 서로 다른 매개변수를 갖는 여러 메소드를 같은 이름으로 정의하는 것이라고 할 수 있다.

💡메소드 오버로딩의 조건
1. 메소드의 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.
3. 메소드 오버로딩은 반환타입과는 관계가 없다. 메소드의 매개변수는 같은데 반환 타입만이 다른 경우에는 오버로딩이 성립하지 않는다.

public void printCarInfo(int number) {
    this.printCarInfo();
    System.out.println("number: " + number);
}


public void printCarInfo(String date, int number) {
    this.printCarInfo();
    System.out.println("date: " + date);
    System.out.println("number: " + number);
}

접근 제어자

클래스의 변수나 메소드의 접근에 제한을 두는 키워드이다.

객체 지향에서 정보 은닉(Data Hiding)이란 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념이다.
그렇게 함으로써 사용자는 언제나 최소한의 정보만으로 프로그램을 손쉽게 사용할 수 있게 된다.

접근 제어자를 사용하면 클래스 외부에서의 직접적인 접근을 허용하지 않는 멤버를 설정하여 정보 은닉을 구체화할 수 있다.

종류설명
public어디서든 접근 가능
protected해당 패키지 및 상속받은 클래스에서 접근 가능
default해당 클래스가 포함된 패키지 내에서만 접근 가능
private해당 클래스 내에서만 접근 가능

static

  • 변수나 메소드의 특성을 바꾸는 키워드
  • 메모리에 한번만 할당되며 공유되는 특성을 가진다.
  • static 클래스 변수는 해당 클래스의 각 개체들이 값을 공유한다.
  • static 클래스 메소드는 객체를 생성하지 않아도 호출 가능하다.
  • 프로그램 시작시 최초에 단 한번만 생성되고 초기화 된다.
  • 자바에서 static 제어자를 사용할 수 있는 대상은 메소드,변수,초기화 블록이다.
profile
느리더라도 꾸준하게

0개의 댓글