JAVA 객체지향언어

sung eon·2022년 5월 17일
0

JAVA

목록 보기
9/21

클래스(Class)

이 붕어빵 틀을 Class라고 생각하면 된다.
그럼 class는 무엇이냐~? 어떤 속성, 어떤 모양을 갖는지 미리 붕어빵 틀처럼 정해져 있는 것으로 실제로 여기에 밀가루 반죽, 팥 넣고 불로 구워주면 붕어빵이 하나씩 하나씩 나오게 되는데, 이 틀 같은 경우는 붕어빵이 4개가 나온다. 그래서 이 틀을 통해서 만들어진 붕어빵을 instance라고 생각하면 된다.
그래서 첫번째 찍어낸 붕어빵과 두번째 찍어낸 붕어빵은 서로 서로 다른데, 하지만 붕어빵이라는 모습은 동일하다.
내가 한입 베어먹은 붕어빵은 다른 붕어빵이랑 또 다른 모습을 띄는데, 이처럼 instance는 한 번 생성되고 나면 그 자체의 상태를 가지고 그 자체로 변화하게 된다.

  • instance란?
    어떤 클래스로 부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.

붕어빵 틀(class): Phone
붕어빵 1(instance1): galaxy
붕어빵 2(instance1): iphone
어떤 것이 와도 서로 다른 객체로 만들어지믄 그 각자 객체의 값을 가지게 된다.
instance의 member에서 접근할 때는 앞에 선언해준 이름 뒤에 .을 찍고 member 변수에 해당하는 변수를 선언해주면 접슨할 수 있다. ( = )을 하면 할당을 하게 된다. 그냥 iphone.model 하면 값을 불러오게 된다.

  • method란?
    어떤 작업을 수해하는 코드를 하나로 묶어 놓은 것
int[] heights = new int[5] {10, 20, 30, 40, 50};
//키가 저장되어 있는 배열

initHeight(heights);
//initHeight가 빨간색으로 표시되는 이유는 아직 함수를 선언하지 않아서 그럼.
sortHeight(heights);
//heights를 오름차순으로 정렬하고싶어.
printHeight(heights);
//heights에 있는걸 하나하나 꺼내서 출력하고 싶어.

만약 내가 initHeight, sortHeight, printHeight같은 함수를 쓰지 않는다면 초기화하는 로직(int[5] {10, 20, 30, 40, 50};)을 꼭 적어줘야한다. 만약에 sortHeight라는 함수를 따로 만들지 않는다고 하면,

int[] heights = new int[5] {10, 20, 30, 40, 50};

sortHeight(heights);
heights[0] = 50;
heights[1] = 40;
heights[2] = 30;
heights[3] = 20;
heights[4] = 10;

이렇게 오름차순으로 하나하나 다 적어줘야 한다.

그래서,

  • 어떤 일정한 작업의 단위
  • 중복된 코드가 있다면
  • 프로그램의 재사용성 구조화를 위해서
    이렇게 mothod를 선언해서 사용한다.

*지켜주면 좋은 코드 covention (암묵적인 룰!)
1. 동사로 시작을 해야된다.
2. 변수이름처럼 camel case로 작성해야한다.

예) 더하기 함수

int add(int x, int y) {
// 
	return x + y //결과는 x + y야

이 아래에

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

를 하더라도 위의 x와 y랑은 상관이 없다!


생성자

생성자는 instance가 생성될 때, 정확히는 앞에서 new라는 키워드를 통해서 class의 instance를 생성했을 때 그 때 불리는 초기화 method이다. 그러니까 method의 일종인데, new를 할 때만 불리는 녀석이다.

생성자 규칙
생성자 형식은 class의 이름이 있으면 class이름이랑 똑같은 이름으로 지어 주어야 한다.

생성자 특징
생성자는 return 값이 없다.
왜냐하면, 우리가 new를 했을 때 그 개체의 결과가 return이 되지 특별히 다른 값이 return이 되지 않기 때문.

class Phone {
    String model;
    String color;
    int price;

public class Main {
    public static void main(String[] args) {
        Phone galaxy = new Phone("Galaxy10", "Black", 100);

        Phone iphone =new Phone("iPhoneX", "Black", 200);

        System.out.println("철수는 이번에 " + galaxy.model + galaxy.color + " + 색상을 " + galaxy.price + "만원에 샀다.");
        System.out.println("영희는 이번에 " + iphone.model + iphone.color + " + 색상을 " + iphone.price + "만원에 샀다.");
    }
}

이 때
Phone galaxy/iphone = new 가 붙는데 우리가 생성자를 만들어 주지 않았는데 new가 되어있다. 사실은 생성자가 없는게 아니라 우리가 생성자를 아무것도 만들어 주지 않으면 JAVA complier가 아무것도 없는 빈 생성자 하나를 자동으로 만들어줘서 우리가 new Phone(); 이렇게 해서 괄호 안에 아무 값도 안 넣고 instance를 만들 수 있다.

이번에는 model, color, price를 모두 세팅할 수 있는 constructor를 만들어보자.

constructor의 이름은 return 값이 아무것도 오지 않아야 되고, class의 이름과 같아야 한다 = Phone
()안에는 파라미터로 받을 변수들을 입력한다.
String model, String color, int price...

class Phone 안에 있는 String model 등등 과는 다른 아이들이고 각각 this.model 등등 이 된다.

class Phone {
    String model;
    String color;
    int price;

    Phone(String model, String color, int price) {
        this.model = model;
        //class Phone안의 instance가 가지고있는 model은 this.model이다.
        //= model 이 파라미터인 String model이다.
        this.color = color;
        this.price = price;
    }
}

public class Main {
    public static void main(String[] args) {
        Phone galaxy = new Phone("Galaxy10", "Black", 100);

        Phone iphone =new Phone("iPhoneX", "Black", 200);

        System.out.println("철수는 이번에 " + galaxy.model + galaxy.color + " + 색상을 " + galaxy.price + "만원에 샀다.");
        System.out.println("영희는 이번에 " + iphone.model + iphone.color + " + 색상을 " + iphone.price + "만원에 샀다.");
    }
}

Phone 블라블라는 Cmd + N 눌러서 나오는 Generate에서 Constructor 누르면 자동 생성된다!

그리고 나서

이렇게 new Phone() 괄호 안을 채워줘도 값은 똑같이 출력된다. 하지만 아까보다 코드는 훨씬 심플해졌다.
왜냐하면 매번 model, color, price, model, color , price 이렇게 갤럭시 아이폰 따로 셋팅해 줬던 것을 한줄로 끝내버렸기 때문!

생성자로 아무값도 셋팅해주지 않았을 때 instance는 member 변수의 기본값을 갖게 된다. 앞에 자료형 챕터에서 숫자형 등등의 기본값처럼.

이것들을 생성자를 쓰지 않고 여기서 바로 new를 했을 때 어떻게 출력이 되느냐! (기본값이 찍히겠지?)

profile
코베베

1개의 댓글

comment-user-thumbnail
2022년 5월 18일

어제 TIL에 붕어빵 이야기가 많네요 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 슈크림 붕어빵 땡기니까 책임지세요.

답글 달기