[코드스테이츠] S1.Unit6 회고

JinYoung Choi·2022년 12월 28일
0

어느덧 부트캠프를 시작한지도 2주라는 시간이 지났다.. 진짜 순식간에 지나갔다. 뭐 했길래? 라고 생각도 잠시 했지만 블로그에 써낸 글들을 보니 많은 걸 배웠구나..

Unit6에서는 클래스,객체,필드,메서드,생성자에 대해 배웠다.
페어프로그래밍이 없어서 그런지 시간적으로 여유가 넘쳤다! 숨좀 고를수 있어서 좋다 ㅎㅎ
남는 시간에는 심화 실습문제도 열심히 풀었다.
여러가지의 프로그래밍 문제를 풀어보면서 갑자기 의욕이 불타오르고 서서히 코딩이 재밌어지기 시작했다..
쭉 가보자!!

국민취업지원제도 상담도 다녀왔다. 어제 3번의 상담을 끝내서 이번달 부터 50만원씩 받게 되었다.
이제 6개월간 상담은 없고 부트캠프가 끝나고 난후에 이어진다고 한다. 자소서도 봐주고 인턴도 연계해준다고 하니 굉장히 좋은 프로그램 같다. 열심히 해야지!

클래스

객체를 정의한 '설계도(blueprint)' 또는 '틀(frame)'

객체를 생성하는데 사용.

클래스를 통해 생성된 객체를 '인스턴스(instance)' 라고 부른다.

=> 클래스로 부터 객체를 만드는 과정 - 인스턴스화(instanciate)

객체와 인스턴스의 차이

  • 객체는 모든 인스턴스를 포괄하는 넓은 의미를 가지고 있는 반면, 인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조한다는 데 차이가 있다.

클래스를 한번 잘 정의해 놓으면 객체를 생성할 때마다 잘 이용할 수 있다.

클래스의 구성요소와 기본 문법

클래스는 기본적으로 class 키워드 사용. 주로 대문자로 시작.

public class ExampleClass {
	int x = 10; // (1)필드
	void printX() {...} // (2)메서드
	ExampleClass {...} // (3)생성자
	class ExampleClass2 {...} // (4)이너 클래스
} 
  1. 필드 - 클래스의 속성을 나타내는 변수 ex) 컬러 , 바퀴의 수
  2. 메서드 - 클래스의 기능을 나타내는 함수 ex) 정지하기 , 가속하기
  3. 생성자 - 클래스의 객체를 생성하는 역할
  4. 이너 클래스 - 클래스 내부의 클래스

1,2,4 -> 3가지 요소를 클래스의 멤버 라고 부름

객체

객체는 우리가 인지할 수 있는 '실재하는 모든 것', '사용할 수 있는 실체'를 의미

객체의 생성

new 키워드를 사용하여 생성 가능, 객체를 생성한 후에는 포인트 연산자(.)를 통해 접근 가능

class CarTest {
	public static void main(String[] args) {

	Car bmw = new Car(); // Car 클래스를 기반으로 생성된 bmw 인스턴스
	Car tesla = new Car(); // Car 클래스를 기반으로 생성된 tesla 인스턴스
	Car audi = new Car(); // Car 클래스를 기반으로 생성된 audi 인스턴스
}

new 키워드와 생성자를 통해 클래스의 객체를 생성 한다는 것
-> 해당 객체를 힙 메모리에 넣고 그 주소값을 참조변수에 저장하는 것과 같다.

출력 값

필드

필드는 ‘클래스에 포함된 변수'를 의미하는 것으로 객체의 속성을 정의할 때 사용

자바에서 변수는 크게 클래스 변수(cv, class variable), 인스턴스 변수(iv, instance variable), 그리고 지역 변수(lv, local variable)라는 세 가지로 구분.

이 중 필드라 부른 것은 클래스 변수와 인스턴스 변수이며, 이 둘은 다시 static 키워드의 유무로 구분

class Example { // => 클래스 영역
	int instanceVariable; // 인스턴스 변수
	static int classVariable; // 클래스 변수(static 변수, 공유변수)

	void method() { // => 메서드 영역
		int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
	}
}

인스턴스 변수(iv)는 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수로 new 생성자() 를 통해 인스턴스가 생성될 때 만들어진다.

static 키워드를 통해 선언하는 클래스 변수(cv)가 있다. 클래스 변수는 독립적인 저장 공간을 가지는 인스턴스 변수와 다르게 공통된 저장공간을 공유한다.
지역변수는 메서드 내에 선언되며 메서드 내({} 블록)에서만 사용가능한 변수이다.

static 키워드

static 키워드가 붙어있는 멤버를 우리는 ‘정적 멤버(static member)’라고 부르고 static이 붙어있지 않은 인스턴스 변수와 구분한다.

인스턴스 멤버는 기존에 우리가 배웠던 내용처럼 반드시 객체를 생성한 이후에 변수와 메서드에 접근하여 해당 멤버를 사용가능한 반면, static 키워드로 정의되어 있는 클래스 멤버들은 인스턴스의 생성 없이도 클래스명.멤버명 만으로도 사용이 가능하다.

메서드(Method)

메서드는 “특정 작업을 수행하는 일련의 명령문들의 집합"을 의미.

메서드의 반환타입이 void가 아닌 경우에는 메서드 바디({} )안에 반드시 return 문이 존재해야한다.

메서드의 호출

메서드도 클래스의 멤버이므로 클래스 외부에서 메서드를 사용하기 위해서는 먼저 인스턴스를 생성해야한다. 포인트 연산자(.)를 통해 메서드를 호출가능
반면, 클래스 내부에 있는 메서드끼리는 따로 객체를 생성하지 않고도 서로를 호출할 수 있다

메서드이름(매개변수1, 매개변수2, ...); // 메서드 호출방법. 매개 변수가 없을 수도 있음.

printHello(); // 위의 코드 예제 호출
getNumSeven();
multiply(4, 4.0);

//출력값
hello!
7
16.0

메서드 호출 시 괄호() 안에 넣어주는 입력 값을 우리는 ‘인자(argument)’라고 하는데, 인자의 개수와 순서는 반드시 메서드를 정의할 때 선언된 매개변수와 일치되어야 한다.

메서드 오버로딩(Method Overloading)

매서드 오버로딩이란 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것을 의미.

오버로딩이 성립하기 위해서는 크게 두 가지 조건이 성립되어야 함.

  • 같은 이름의 메서드명
  • 매개변수의 개수나 타입이 다르게 정의

장점은 하나의 메서드로 여러 경우의 수를 해결할 수 있다

class Shape {
    public void area() { // 메서드 오버로딩. 같은 이름의 메서드 4개.
        System.out.println("넓이");
    }
    public void area(int r) {
        System.out.println("원 넓이 = " + 3.14 * r * r);
    }

    public void area(int w, int l) {
        System.out.println("직사각형 넓이 = " + w * l);
    }

    public void area(double b, double h) {
        System.out.println("삼각형 넓이 = " + 0.5 * b * h);
    }
}

생성자(Constructor)

new 키워드를 사용하여 객체를 생성할 때에 호출되는 것 -> 생성자

인스턴스 생성을 담당하는 것은 new 키워드이며, 생성자는 인스턴스 변수들을 초기화하는 데 사용되는 특수한 메서드

  • 생성자의 이름은 반드시 클래스의 이름과 같아야 한다
  • 생성자는 리턴 타입이 없다.
class Constructor {
    Constructor() { // 생성자 
        System.out.println("생성자");
    }

생성자가 클래스 안에 포함되어 있지 않은 경우에는 자바 컴파일러가 기본 생성자를 자동으로 추가해준다

인스턴스를 생성 시 매개변수가 있는 생성자를 사용하게되면 인스턴스를 만든 후에 인스턴스의 필드값을 일일이 설정해줄 필요없이 생성과 동시에 원하는 값으로 설정해줄 수 있어서 굉장히 편리하다.

this , this()

this()

메서드의 호출 내용에서 같은 클래스 안에 메서드들끼리 서로 호출할 수 있었던 것처럼 생성자도 상호 호출이 가능하며. 그리고 이를 위해 사용하는 것이 바로 this() 메서드이다.

this() 메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용한다.

  • this() 메서드는 반드시 생성자의 내부에서만 사용할 수 있다.
  • this() 메서드는 반드시 생성자의 첫 줄에 위치해야 한다.
public class Test {
    public static void main(String[] args) {
        Example example = new Example();
        Example example2 = new Example(5);
    }
}

class Example  {
    public Example() {
        System.out.println("Example의 기본 생성자 호출!");
    };

    public Example(int x) {
        this();
        System.out.println("Example의 두 번째 생성자 호출!");
    }
}

//Output
Example의 기본 생성자 호출!
Example의 기본 생성자 호출!
Example의 두 번째 생성자 호출!

this

public class ConstructorExample {
    public static void main(String[] args) {
        Car car = new Car("Model X", "빨간색", 250);
        System.out.println("제 차는 " + car.getModelName() + "이고, 컬러는 " +  car.getColor() + "입니다.");
    }
}

class Car {
    private String modelName;
    private String color;
    private int maxSpeed;

    public Car(String modelName, String color, int maxSpeed) {
        this.modelName = modelName;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }

    public String getModelName() {
        return modelName;
    }

    public String getColor() {
        return color;
    }
}

//Output
제 차는 Model X이고, 컬러는 빨간색입니다.

인스턴스 변수와 매개변수를 이름만으로는 구분하기가 어려워지는 문제가 발생하게 되는데, 이를 구분해주기 위한 용도로 주로 사용되는 방법이 바로 this 키워드이다.

this는 인스턴스 자신을 가리키며, 우리가 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 this를 통해서 인스턴스 자신의 변수에 접근할 수 있는 것이다.

내부 클래스

내부 클래스(Inner Class)는 클래스 내에 선언된 클래스로, 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용

내부 클래스를 사용하면 외부 클래스의 멤버들에 쉽게 접근 할 수 있고, 코드의 복잡성을 줄일 수 있다.

class Outer { // 외부 클래스
	
	class Inner {
		// 인스턴스 내부 클래스	
	}
	
	static class StaticInner {
		// 정적 내부 클래스
	}

	void run() {
		class LocalInner {
		// 지역 내부 클래스
		}
	}
}
profile
백엔드 취준생

0개의 댓글