[4기] 백엔드 개발자 부트캠프 "오르미" ~ing/[4기] 백엔드 개발자 부트캠프 오르미 수업 복습

[4기] 30일차 Java ( class의 구성 : 필드, 생성자, 메소드 )

sohee99 2024. 1. 31. 18:17

오늘의 학습 ! ( class의 구성 : 필드, 생성자, 메소드 ) 

 

클래스 구성 필드, 생성자, 메소드의 이해를 잘 못하겟더라구요 ㅠㅠ

 

 

힘들었습니다 ㅠㅠㅠㅠ 수업을 듣는 내내 머엉------ 했달까요 ,.,,,,, 

 

강사님이 자바 책한권이 있으면 좋다길래 자바의 정석을 구매해서

 

 

오늘 왔습니다! 오늘 클래스 필드 생성자 메소드에 대해 배운걸 

 

책으로 한번 다시 더 보려구요 ㅠㅠㅠㅠ

 

 

Car 클래스를 이용하여 나만의 차를 만드는 코드를 짜볼려고할 때, 

 

 

아,, 내가 이해를 못했구나 이해도 못했지만 아직 코드 작성하는데 익숙하지 않은게 더 컸던거같아요 ㅠ

 

손을 못건드리겠더라구욥.....

 

 

자주자주 코드 작성하는 연습이 필요할 거 같아요 ㅠㅠㅠㅠㅠㅠㅠㅠ 

 

오늘 최대한 배운 내용 이해하는 부분까지만 작성하고 

 

나머지는 오늘 자바의 정석 책 온걸로 오늘 배운 부분을  따로 공부할 생각입니다!!!! 

 

 

일단 필드! 

 

필드( 멤버 변수 ) 

 

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

 

public class Car {
    String company;

    int speed;

    String sw = "samsung";

 

company 라는 변수가 추가되었는데 이것이 클래스에 선언된 변수를 멤버 변수 혹은 필드라고 한다! 

 

즉, 클래스에 선언된 변수는 멤버변수 ( 필드 ) 라고 생각하자!!!

 

public class Car {
    String company;

    public static void main(String[] args) {
        Car car = new Car();
        System.out.println(car.company);
    }
}

 

이렇게 필드에 접근하여 출력 값을 내면? 

 

null이 나온다 왜?

 

필드로 company를 선언하였지만, 초기값을 대입하지 않았기 때문에 null 값이 출력된것!

 

 

그럼 초기값을 BMW로 바꾸고 싶다면?

 

public class Car {
    String company = "BMW";

    public static void main(String[] args) {
        Car car = new Car();
        System.out.println(car.company);
    }
}

 

이렇게 필드 company에 BMW 값을 넣어줌으로서 초기화 완료!

 

생성자

- new 연산자와 같이 사용되며 클래스로부터 객체 생성 시, 호출 되어 객체의 초기화를 담당한다. 

 

public class Car {
    String company;

    // 생성자에서 필드 초기화
    Car() {
        company = "현대자동차";
    }

    public static void main(String[] args) {
        Car car = new Car();
    }
}

 

Car(){ } 초기화를 진행한다! 

 

생성자의 규칙
1. 클래스명과 메서드명은 =(같다)
2. 리턴 타입을 정의하지 않는다. ( void 도 사용 x )

- 생성자 앞에 접근제어자로 public, private 모두 올 수 있다. 

new 클래스명 ( 입력인수, ... )

 

 

public class Car {
    String company;

    Car(String company) {
        this.company = company;
    }

    public static void main(String[] args) {
        Car car = new Car();  // Error: 아무런 값도 입력하지 않는 생성자
    }
}

 

이렇게 입력인수를 받은 생성자와 Car(){} 입력 인수를 받지 않은 생성자의 경우가 있는데엽!

 

여기서 아무 입력 인수를 받지 않은 생성자를 디폴트 생성자라고 불린다. 

 

 

만약 클래스에 생성자가 하나도 없다면, 컴파일러는 자동으로 디폴트 생성자를 추가 

하지만 사용자가 작성한 생성자가 하나라도 구현되어 있다면 컴파일러는 디폴트 생성자를 추가하지 않음!

 

 

생성자 오버로딩

 

- 클래스 내에 같은 이름의 함수를 여러개 선언하는것! 

 

public class Car {
    String company;
    String model;
    int maxSpeed;

    //1번 생성자
    Car(String company) {
        this.company = company;
    }

    //2번 생성자
    Car(String company, String model) {
        this.company = company;
        this.model = model;
    }

    //3번 생성자
    Car(String company, String model, int maxSpeed) {
        this.company = company;
        this.model = model;
        this.maxSpeed = maxSpeed;
    }
}

 

public class CarExample {

    public static void main(String[] args) {
        Car sonata = new Car("현대");                 // 1번 생성자 이용
        Car sportage = new Car("기아", "sportage");   // 2번 생성자 이용
        Car gv80 = new Car("제네시스", "gv80", 300);   // 3번 생성자 이용
    }
}

 

이렇게 하나의 메소드 안에 여러 기능을 추가 할 수 있다! 

 

Car(String company)  / Car(String company, String model) / Car(String company, String model, int maxSpeed)

 

또한, 생성자에도 오버로딩이 사용가능하다! 

 

new Car("현대"); / new Car("기아", "sportage"); / new Car("제네시스", "gv80", 300);

 

 

 

메소드

 

- 클래스 내에 함수를 메서드

 

출처 - 이스트소프트 조성연

 

 

믹서기에 넣은 과일을 입력, 결과물 주스를 출력 , 믹서기가 바로 메서드! 

 

입력값 > 수행한 다음 결과값을 내주는것이 메서드의 일!!!

 

 

 

 

리턴( return ) 문 

 

double divide(double x, double y){
    return  x / y;
}

 

divide 메서드는 입력값 x, y를 받으며 리턴 값은 두개의 입력값을 x / y 나누어진 값이다.

 

return은 메서드의 결과값을 돌려주는 명령어!

 

public class Calculator {
    double result;

    double add(double x, double y){
        return x + y;
    }

    double divide(double x, double y){
        return  x / y;
    }

    int multiply(int x, int y){
        //double로 리턴타입을 지정하면 실수형 값인 20.0이 나온다.
        return  x * y;
    }

    int minus(int x, int y){
        return x - y;
    }

    int postfixOperator(int a){ //call by value
        a++;
        return a;
    }

    public static void main(String[] args) {

       Calculator calculator = new Calculator();

       calculator.result = calculator.add(1,5);
        System.out.println(calculator.result);

        // 객체 생성
        double result = calculator.add(1.45, 6.78);

        System.out.println(result);
        //리턴 타입이 있더라도 호출만해줘도 상관없음! calculator.divide 호출 *변수로 받아주지 않아도 됨!
        double divResult = calculator.divide(4.56,3.4);
        System.out.println(divResult);

        System.out.println(calculator.multiply(4,5));

        System.out.println(calculator.minus(6,3));

 

다양하게 해보기 ㅎㅎㅎㅎ 

 

타입을 double로도 바꿔보고 int도 해보고 

 

다양하게 해봅시다아!!!!

 

 

메소드

double add(double x, double y){
    return x + y;
}

 

x, y는 매개변수이고, (  메소드에 전달된 입력값을 저장하는 변수 ) 

public static void main(String[] args) {

   Calculator calculator = new Calculator();

   calculator.result = calculator.add(1,5);
    System.out.println(calculator.result);

 

이렇게, add(1,5) 가 인수! 메서드를 호출할 때 전달하는 입력값! 

 

기억하자아!!!😋

 

this

Car(String company, int speed){
    this.company = company;
    this.speed = speed;
}

 

이렇게 이름이 동일할 경우 this를 사용한다! 

 

this는 생성자와 메소드의 매개변수이름이 필드와 동일한경우와 인스턴스의 필드임을 명시하고자 할 때 사용한다! 

 

 

이렇게 기본개념은 이해가 되는데 

 

막상 이걸 사용하라고 하면 

 

정신줄 놓는거 있죠? ㅋㅋㅋㅋㅋㅋㅋㅋ.... 

 

오늘 Daily Quiz 는 클래스를 구현해보는 것이기 때문에 

 

이걸 만들어보면서 

 

복습하는것이 좋을 거같아요 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ 

 

 

지금 자바하면서 클래스 부분이 좀 헷갈리네엽... 자바의 정석으로 오늘 부분 보고 자는걸로,,,,,ㅠ 

 

 

데일리 퀴즈하러 전 떠나볼게요 ㅠ 

 

 

 

내일 공부도 파이팅하자.....!!!