컴퓨터는 잘못이 없다..

[JAVA]클래스와 객체 본문

공부/JAVA

[JAVA]클래스와 객체

도토리까꿍v 2024. 4. 10. 14:17
Contents 접기

#개념 정리

  1. 클래스
    1. 클래스는 객체를 정의하는 설계도
    2. 클래스 - 객체변수, 메소드로 이루어짐 
  2. 객체, 인스턴스
    1. 객체(Object) 는 실체
    2. 인스턴스(instance)는 클래스와 객체의 관계, 클래스를 인스턴스화 하면 객체, 객체는 클래스의 인스턴스
    3. 객체는 new로 생성
  3. 생성자
    1. 객체가 생성될 때 자동으로 호출됨
    2. 클래스명과 이름이 동일
    3. 리턴타입 없음
  4. this, this()
    1. 객체 자신을 의미
    2. this()는 생성자를 의미
  5. 오버로딩(overloading)
    1. 한 클래스 내에서 같은 이름의 메소드를 여러 개 정의
    2. 오버로딩 조건 - 메소드와 이름이 같아야 하고 동시에 메개변수 개수 또는 타입이 달라야 함 (리턴 타입의 차이는 오버로딩이 되지 않음)
  6. 접근제어자 
    1. 클래스의 변수나 메소드의 접근에 제한을 두는 키워드
    2. 접근 제어자 종류
      1. private : 해당 클래스에서만 접근 가능
      2. public : 어디서든 접근 가능 
      3. default : 해당 패키지 내에서만 접근 가능 (아무것도 적지 않은게 default)
      4. protected : 해당 패키지 및 상속받은 클래스에서 접근 가능
  7. Static
    1. 변수나 메소드의 특성을 바꾸는 키워드
    2. Static 특징
      1. 메모리에 딱 한 번 할당된다.
      2. static 변수나 메소드는 공유되는 특징을 가진다.
    3. static 클래스 변수 -  해당 클래스의 각 객체들이 값을 공유
    4. static 클래스 메소드 - 객체를 생성하지 않아도 호출 가능

#소스코드

 

1. 클래스와 객체 생성 방법

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

class Car {
    String name; //객체 변수
    String type; //객체 변수

    public void printCarInfo() { //메소드, void는 반환값이 없음을 의미
        System.out.println("=== Car Info ===");
        System.out.println("name: " + name);
        System.out.println("type: " + type);
    }

    public void move() {
        System.out.println("이동!");
    }

    public void brake() {
        System.out.println("정지!");
    }
}

class Car2 {
    String name;
    String type;

//    Car2() {} //default 생성자
    Car2(String name, String type) { //생성자
        this.name = name; //this는 객체 자신을 의미, 즉 왼쪽 this.name 은 객체 자신의 변수 오른쪽 name은 파라메터 name을 의미
        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();
        myCar1.move();
        myCar1.brake();

        //Car2 클래스 사용
        Car2 myCar2 = new Car2("b", "sedan"); //생성자를 만들 때, 데이터를 입력받게 만들었으므로 데이터를 넘겨줘야함
        myCar2.printCarInfo();
        myCar2.load();
        myCar2.horn();
    }
}

 

 

2. 클래스와 객체 생성방법 예제

//  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("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();
    }
}

 

 

3. 오버로딩 구현, 접근제어자,  static 변수와 static 메소드

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

import car.Car2;

class Car {
    String name;
    String type;

    Car(String name, String type) { //생성자
        this.name = name;
        this.type = type;
    }

    //오버로딩 구현 s
    //1. 파라메터가 없는 출력해주는 메소드
    public void printCarInfo() {
        System.out.println("=== Car Info ===");
        System.out.println("name: " + name);
        System.out.println("type: " + type);
    }

    //2. 날짜를 파라메터로 받아서 출력해주는 메소드
    public void printCarInfo(String date) {
        printCarInfo();
        System.out.println("date: " + date);
    }

    //3. 숫자를 파라메터로 받아서 출력해주는 메소드
    public void printCarInfo(int number) {
        printCarInfo();
        System.out.println("number: " + number);
    }

    //4. 날짜와 숫자를 파라메터로 받아서 출력해주는 메소드
    public void printCarInfo(String date, int number) {
        printCarInfo();
        System.out.println("date: " + date);
        System.out.println("number: " + number);
    }
    //오버로딩 구현 e

}


class Car3 {
    static String name = "None"; //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() { //static함수  -> 객체가 만들어지기 전부터 자동으로 함수가 생성됨, 당연히 staic메소드에서는 static변수만 사용가능
        System.out.println("Car name: " + name);
//        System.out.println("Car type: " + type);
    }
}


public class Main {

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

//      1. 오버로딩
        myCar1.printCarInfo("2022");
        myCar1.printCarInfo(1);
        myCar1.printCarInfo("2022", 1);


//      2. 접근 제어자
        System.out.println("=== 접근 제어자 ===");
        Car2 myCar2 = new Car2("a", "b", "c", "d", "e", "f", "g"); //다른 패키지에 있는 클래스를 객체로 생성
        System.out.println("name1: " + myCar2.name1);
        System.out.println("name2: " + myCar2.name2);
        System.out.println("name3: " + myCar2.name3);
        System.out.println("name4: " + myCar2.name4);
//        System.out.println("private name5: " + myCar2.name5); //접근 불가
//        System.out.println("protected name6: " + myCar2.name6); //접근 불가
//        System.out.println("default name7: " + myCar2.name7); //접근 불가


//      3. Static
        System.out.println("=== Static ===");
        Car3.getName(); //static함수는 클래스명을 통해서 메소드를 호출할 수 있다.
        Car3 myCar3_1 = new Car3("a", "sedan");
        Car3 myCar3_2 = new Car3("b", "suv");
        Car3 myCar3_3 = new Car3("c", "rv");

        //name은 모두 c로 출력된다. 왜 그럴까?
        //static변수는 객체끼리 이 변수를 공유한다.
        //따라서, static 특성때문에 다른 객체에서 static변수에 값을 변경하게 되면 가장 마지막에 변경된 값으로 저장된다.
        myCar3_1.printCarInfo();
        myCar3_2.printCarInfo();
        myCar3_3.printCarInfo();

        Car3.getName();
        
    }

}

 

4. 오버로딩 구현, 접근제어자,  static 변수와 static 메소드 예제

// 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));
    }
}

'공부 > JAVA' 카테고리의 다른 글

[JAVA]상속  (0) 2024.04.10
[JAVA]다차원배열  (0) 2024.04.07
[JAVA]반복문  (1) 2024.04.07
Comments