코드스테이츠 BE 11일차 - Java 클래스와 객체

coding infant·2022년 7월 7일

코드스테이츠BE

목록 보기
11/48

객체지향 어렵다
전체적인 컨셉 파악하는 것이 중요!

다면성 (다양한 면이 있다)
Object-Oriented Programming (OOP)
객체는 속성(state)과 기능(behavior)의 집합
속성은 필드(변수)로, 기능은 메서드로 정의

클래스 : 객체를 정의한 설계도. 붕어빵틀 (객체: 실제 제품. 오브젝트라고도 함. 붕어빵). 클래스 ≠ 객체
인스턴스 : 클래스로부터 만들어진 객체. (인스턴스화: 객체를 만드는 과정)

클래스와 객체

[클래스]

class ClassName {           // 클래스 이름은 대문자로 시작
    int x = 값;             // 필드 (클래스의 속성)
    void print             // 메서드 (클래스의 기능)
    ExClass                // 생성자 (클래스의 객체 생성)
    class ExClass2         // 이너 클래스 (클래스 내부의 클래스)
}                          // 클래스의 멤버 : 필드, 매서드, 이너클래스

객체 생성

클래스명 참조변수명;        // 인스턴스를 참조하기 위한 참조변수 선언
참조변수명 = new 생성자(); // 인스턴스 생성 후, 객체의 주소를 참조 변수에 저장

// 또는 한 줄로 표현 가능
클래스명 참조변수명 = new 생성자();

객체 활용

참조변수명.필드명          // 필드값 불러오기
참조변수명.메서드명()      // 메서드 호출

참고 사이트

[클래스]
http://wiki.hash.kr/index.php/%ED%81%B4%EB%9E%98%EC%8A%A4
https://en.wikipedia.org/wiki/Class_(computer_programming)

[객체]

http://wiki.hash.kr/index.php/%EA%B0%9D%EC%B2%B4
https://en.wikipedia.org/wiki/Object_(computer_science)

필드와 메서드

[필드]

클래스에 포함된 변수. 객체의 속성 정의
변수 (클래스, 인스턴스, 지역) 중 클래스 변수(static O)와 인스턴스 변수(static X) 를 필드라고 부름

class Example {              // 클래스 영역
    int 상수변수이름;           // 인스턴스 변수
    static int 상수변수이름2    // 클래스 변수 (static 변수, 공유 변수)

    void 메서드이름() {        // 메서드 영역
        int 상수변수이름3 = 0;  // 지역변수. {} 블록 안에서만 유효
    }
}

인스턴스 변수(iv) : new 생성자() .객체 고유의 개별성. 강제 초기화

클래스 변수(cv) : static 사용. 공통된 저장공간 공유. 클래스명.클래스변수명 으로 클래스 변수 사용 가능. 강제 초기화

지역변수(lv) : 메서드 내에서만 사용가능. 직접 초기화

static

클래스의 멤버(필드, 메서드, 이너 클래스)에 사용. 정적 멤버 (<-> 인스턴스 변수).
static 사용시 변수(new) 지정 않고도 클래스명.멤버명 으로 사용 가능

public class StaticTest {
    public static void main(String[] args) {
        StaticExample staticExample = new StaticExample();
        System.out.println("인스턴스 변수: " + staticExample.num1);       // 인스턴스 변수: 10. 포인트 연산자 사용
        System.out.println("클래스 변수: " + StaticExample.num2);         // 클래스 변수: -10. 객체 생성 없이 클래스명 사용
    }
}

class StaticExample {
    int num1 = 10;
    static int num2 = -10;

정적 필드는 객체 간 공유 변수 적용 (메서드 앞에 사용시 정적 메서드로)

정적 메서드는 인스턴스 변수/메서드 사용 불가


public class StaticFieldTest {
    public static void main(String[] args) {
        StaticField staticField1 = new StaticField();       // 객체 생성
        StaticField staticField2 = new StaticField();

        staticField1.num1 = 100;
        staticField2.num1 = 1000;

        System.out.println(staticField1.num1);              // 100
        System.out.println(staticField2.num1);              // 1000

        staticField1.num2 = 150;
        staticField2.num2 = 1500;

        System.out.println(staticField1.num2);              // 1500
        System.out.println(staticField2.num2);              // 1500 (static 사용하여 공통값 적용)
    }
}

class StaticField {
    int num1 = 10;              // 인스턴스 필드
    static int num2 = 15;       // 정적 필드

static은 클래스 멤버 앞에 사용 가능 ( 필드, 메서드, 이너클래스). 이를 정적 멤버라고 함.

정적 멤버는 따로 인스턴스 생성하지 않고도 클래스 명으로 변수나 메서드 호출 가능.

클래스 메서드에서 클래스 변수 접근 가능

클래스 메서드에서 인스턴스 변수 접근 불가

-> 참조 불가 에러메세지. (참조 하려면 메모리 어딘가 인스턴스 있어야 함- Car car = new Car(); )

참고 사이트
http://wiki.hash.kr/index.php/%ED%95%84%EB%93%9C_(%EC%9E%90%EB%B0%94)

https://jenkov.com/tutorials/java/fields.html#:~:text=A%20Java%20field%20is%20a,position

[메서드]

객체의 기능을 정의

특정 작업을 수행하는 일련의 명령문들의 집합

메서드 시그니처와 메서드 바디로 구분

자바제어자 반환타입 메서드명(매개 변수) {    // 메서드 시그니처
    메서드 내용                       // 메서드 바디
}

반환 타입 : 해당 메서드가 어떤 타입을 반환하는가 (void는 return문 필요 없음. void 아니면 return문 필요)
메서드명 : 소문자로 표시
매개 변수 : 해당 작업을 수행하기 위해 어떤 재료가 필요한가

[메서드 호출]

클래스 외부에서 메서드 사용 위해 인스턴스 생성해야 -> 포인트 연산자(.) 사용

클래스 내부에서는 따로 객체 생성하지 않고도 서로 호출 가능

void printHello()j {
    System.out.println("hello!")
}

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

void printHello();                    // 위의 코드 호출. hello! 출력

메서드 호출 시 괄호() 안에 넣어주는 입력 값 (인자 argument) 개수와 순서 반드시 메서드 정의할 때의 매개변수와 일치해야! (일치하거나 자동 형변환이 가능해야)

[메서드 오버로딩]
하나의 클래스 안에 같은 이름의 메서드를 여러개 정의. 같은 이름의 메서드로 여러 기능 구현 가능
(같은 이름의 메서드명, 매개변수의 개수나 타입이 다르게 정의)

public class Overloading {
    public static void main(String[] args) {
        Shape s = new Shape();                              // 객체 생성

        s.area();                                           // 메서드 호출
        s.area(5);
        s.area(10,10);
        s.area(6.0, 12.0);
    }
}

class Shape {
    public void area() {                                    // 메서드 오버로딩. 같은 이름 메서드 4개
        System.out.println("넓이");                          // 넓이
    }
    public void area(int r) {
        System.out.println("원 넓이 = "  + 3.14 * r * r);    // 원 넓이 = 78.5
    }
    public void area(int w, int l) {
        System.out.println("직사각형 넓이 = " + w *l);        // 직사각형 넓이 = 100
    }
    public void area(double b, double h) {
        System.out.println("삼각형 넓이 = " + 0.5 * b * h);  // 삼각형 넓이 = 36.0
    }
}


오버로딩 성립 조건 : 같은 메서드명, 다른 매개변수 개수/타입
오버로딩 장점 : 하나의 메서드로 여러 경우의 수 해결 가능 (-> 후에 다형성)

참고 사이트

http://wiki.hash.kr/index.php/%EB%A9%94%EC%86%8C%EB%93%9C

https://jenkov.com/tutorials/java/methods.html

블로깅 세션

개발자는 문제를 해결하는 사람, 새로운 것을 창조하는 사람

-> 어떤 문제를 마주했고 어떻게 해결해 나갔는지가 가장 중요하다

이런 에러 핸들링 로그 꼭 꼭 기록해놓기!

  • TIL (Today I learned)

  • 회고

좋았던 점, 문제점. 좋은 점 어떻게 더 발전시킬것인지, 문제 어떻게 해결해 나갈 것 인지?

자기 객관화를 통해 더 빠르게 성장할 수 있다

기록하고 잊어라.
잊을 수 있는 기쁨을 만끽하면서
항상 머리를 창의적으로 쓰는 사람이 성공한다.
그 비결은 바로 메모 습관에 있다

명언 하루에 하나씩 찾아 보기

좋은 습관 만들기 : 3개월동안 똑같은 행동 반복하기

0개의 댓글