[JAVA] 클래스와 객체

XXXX·2024년 1월 9일
0
post-thumbnail

클래스 (Class)

  • 객체(사물, 실체)를 정의하는 설계도

실생활로 예를 들어 비유해 보면, 붕어빵 틀이 클래스이고, 붕어빵 틀을 통해 만들어지는 여러 붕어빵들이 객체가 된다.


객체, 인스턴스

  • 객체 (Object) : 속성과 동작을 가지는 실체
  • 인스턴스 (Instance) :
    • 클래스와 객체의 관계
    • 클래스로부터 객체를 선언 (= 인스턴스 화)
    • 어떤 객체는 어떤 클래스의 인스턴스

클래스 사용

  • 클래스: 객체를 만들기 위한 설계도
    • 객체 변수, 메소드로 이루어짐
public class 클래스명 {
	// 객체 변수
	// 메소드
	// + 접근제어자
	// + static
}

클래스명 객체명 = new 클래스명(); // 객체 생성

생성자 (Constructor)

  • 객체가 생성될 때 자동으로 호출됨
  • 객체의 초기화를 위해 사용된다.
  • 생성자 규칙
    • 클래스명과 이름 맞추기
    • 리턴 타입 없음
public class 클래스명 {
	클래스명() {}
}

this, this()

  • this : 객체 자신을 의미
  • this() : 생성자


// Java 프로그래밍 - 클래스와 객체_1

// Car 클래스 - 객체변수, 메소드
class Car {
    String name;
    String type;

// Car() {} 생성자가 디폴트 값으로 존재한다. 생략 가능!

    public void printCarInfo() {
        System.out.println("== Car Info == ");
        System.out.println("name = " + name);
        System.out.println("type = " + type);
    } // 메소드1

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

    public void brake() {
        System.out.println("정지!");
    } // 메소드3
}

class Car2 {
    String name;
    String type;

// Car() {} 생성자가 디폴트 값으로 존재한다.
    Car2(String name, String type) { // 받아온 이름을 변수에 대입, 데이터를 바로 입력 받게 설정
        this.name = name; // 이름이 같으므로 this를 이용해 자기 클래스의 객체를 가리킨다.
        this.type = type;
        System.out.println("생성자 출력!");
    }

    public void printCarInfo() {
        System.out.println("== Car Info == ");
        System.out.println("name = " + name);
        System.out.println("type = " + type);
    }

    public void load() {
        System.out.println("짐을 주세요!");
    }

    public void horn() {
        System.out.println("빵빵!");
    }
}


public class Main {

    public static void main(String[] args) {
//      Car 클래스 사용
        Car myCar1 = new Car(); // 클래스를 하나 만들어 객체로 생성해준다.
        myCar1.name = "a";
        myCar1.type = "suv";
        myCar1.printCarInfo(); // 메소드1 출력
        myCar1.move(); // 메소드2 출력
        myCar1.brake(); // 메소드3 출력


//      Car2 클래스 사용
        Car2 myCar2 = new Car2("b", "sedan");
        myCar2.printCarInfo();
        myCar2.load();
        myCar2.horn();

    }
}

//  Practice
//  다음 클래스 직접 만든 후 객체 생성
//  클래스명: Animal
//  특성: 이름, 무게, 분류
//  기능: 먹기, 잠자기, 걷기, 뛰기

class Animal {
    String name;
    double weight;
    String classification;

    Animal(String name, double weight, String classification) {
        this.name = name;
        this.weight = weight;
        this.classification = classification;
    }

    public void printInfo() {
        System.out.println("== Animal Info ==");
        System.out.println("name = " + name);
        System.out.println("weight = " + weight);
        System.out.println("classification = " + classification);
    }

    public void Eat() {
        System.out.println("밥을 먹습니다!");
    }

    public void Sleep() {
        System.out.println("잠을 잡니다.");
    }

    public void Walk() {
        System.out.println("걷습니다!");
    }

    public void Run() {
        System.out.println("뜁니다!");
    }



}

public class Practice {

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


오버로딩 (Overloading)

  • 한 클래스 내에서 같은 이름의 메소드를 여러 개 정의
  • 오버로딩 조건
  1. 메소드의 이름이 같아야
  2. 매개변수의 개수 또는 타입이 달라야 함
    ( 리턴 타입의 차이로는 오버로딩이 되지 않음 )
public class 클래스명 {
	클래스명() {} // 디폴트 생성자
	클래스명(String name, String type) {
    	// 데이터를 넣어서 초기화 하고 싶을 때의 생성자
		구현 내용; 
	}
}

접근제어자

  • 클래스의 변수나 메소드의 접근에 제한을 두는 키워드
  • 접근제어자 종류
    • private: 해당 클래스에서만 접근 가능
    • public: 어디서든 접근 가능
    • default: 해당 패키지 내에서만 접근 가능 (아무것도 안 써줌 = default)
    • protected: 해당 패키지 및 상속받은 클래스에서 접근 가능


Static

  • 변수나 메소드의 특성을 바꾸는 키워드
  • Static 특징
    • 메모리에 한번만 할당됨
    • 즉, Static 변수나 메소드는 공유되는 특성을 가짐
  • Static 클래스 변수 : 해당 클래스의 각 객체들이 값을 공유
  • Static 클래스 메소드 : 객체를 생성하지 않아도 호출 가능


// Java 프로그래밍 - 클래스와 객체_2

import car.Car2;

class Car {
    String name;
    String type;

    Car(String name, String type) {
        this.name = name;
        this.type = type;
    }

    public void printCarInfo() {
        System.out.println("=== Car Info ===");
        System.out.println("name: " + name);
        System.out.println("type: " + type);
    }

    // 오버로딩 구현
    public void printCarInfo(String date) {
        this.printCarInfo();
        System.out.println("date : " + date);
    } // 날짜 출력 메소드

    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);
    } // 날짜와 차 번호 출력 메소드

    // 같은 이름의 메소드는 4개 만들어졌지만, 입력 파라미터의 개수와 타입이 다르므로 서로 다른 메소드로 인식


}


class Car3 { // static을 이용하기 위해 만든 클래스
    // static 변수
    static String name = "None"; // static 메소드에서 사용할 수 있는 변수도 static 이어야 한다.
    String type;

    Car3(String name, String type) {
        this.name = name;
        this.type = type;
    }

    public void printCarInfo() {
        System.out.println("=== Car Info ===");
        System.out.println("name: " + name);
        System.out.println("type: " + type);
    }

    // 스태틱 메소드
    public static void getName() {
        System.out.println("Car name: " + name);
    }

}


public class Main {

    public static void main(String[] args) {
        Car myCar1 = new Car("a", "sedan");
        myCar1.printCarInfo();

//      1. 오버로딩 사용
        System.out.println("=== 오버로딩 사용 ===");
        myCar1.printCarInfo("2022");
        myCar1.printCarInfo(1234);
        myCar1.printCarInfo("2022", 1234);



//      2. 접근 제어자
        System.out.println("=== 접근 제어자 ===");
        Car2 myCar2 = new Car2("a", "b", "c", "d");
        System.out.println(myCar2.name1);
//        System.out.println(myCar2.name2); -> private 접근 안됨.
//        System.out.println(myCar2.name3); -> protected 접근 안됨.
//        System.out.println(myCar2.name4); -> default 접근 안됨.




//      3. Static
        System.out.println("=== Static ===");
        Car3.getName();
        // 메소드를 위의 'Car2 myCar2 = new Car2("a", "b", "c", "d");'과 같은 형태로 만들지 않았는데
        // 바로 클래스 명을 통해 해당 메소드를 호출할 수 있다.
        Car3 myCar3_1 = new Car3("a", "sedan");
        Car3 myCar3_2 = new Car3("b", "suv");
        Car3 myCar3_3 = new Car3("c", "rv");
        myCar3_1.printCarInfo();
        myCar3_2.printCarInfo();
        myCar3_3.printCarInfo();

        // 변수가 static으로 잡혀있으면 객체끼리 그 변수를 공유한다. 따라서 제일 마지막에 바꿔준 변수로 모두 공유가 되어
        // 위의 코드에서 name은 모두 'c'로 출력된다.

    }

}

따로 패키지를 만들어 Car2 구현


package car;

public class Car2 {
    public String name1;
    private String name2;
    protected String name3;
    String name4; // 디폴트를 의미

    public Car2(String name1, String name2, String name3, String name4) {
        this.name1 = name1;
        this.name2 = name2;
        this.name3 = name3;
        this.name4 = name4;

    }
}

// Practice
// 계산기 덧셈의 여러 타입 오버로딩

class Calculator {

    public int sum(int a, int b) {
        return a + b;
    }
    public double sum(double a, double b) { return a + b; }
    public double sum(String a, String b) { return  Double.parseDouble(a) + Double.parseDouble(b); }
    // 스트링을 더블 타입으로 변환 후 더해줌.
    public int sum(int a, int b, int c) { return a + b + c; }

}

public class Practice {
    public static void main(String[] args) {
        // Test code
        Calculator c = new Calculator();
        System.out.println(c.sum(1, 2));
        System.out.println(c.sum(1.0, 2.0));
        System.out.println(c.sum("1", "2"));
        System.out.println(c.sum(1, 2, 3));
    }
}

0개의 댓글