220517_내일배움캠프_TIL

Today Jeeho Learned·2022년 5월 17일
0

TIL

목록 보기
24/249

객체지향 언어 (1) 클래스, 인스턴스, 메소드

  • 클래스
    클래스는 표현하고자 하는 대상의 속성을 한 곳에 모아서 정의 해놓은 것이라고 할 수있다.
    클래스는 붕어빵 틀이라고 생각하면 된다.
    어떤 모양이나 속성을 갖는지는 미리 붕어빵 틀 처럼 정해져 있는 것이다.
    클래스 내부의 정보를 멤버 변수라고 한다.
    (붕어빵 틀에 붕어빵을 만들기 위해서는 안에 들어가는 재료도 필요하다. 이런 재료에 따라서 다른 맛의 붕어빵들이 나올수도있는데, 안에 들어가는 재료와 같은 것을 멤버 변수라고 보면 된다.)

  • 인스턴스
    인스턴스는 어떠한 클래스로 만들어진 객체를 그 클래스의 인스턴스라고 한다.
    붕어빵 틀에서 만들어진 붕어빵을 하나의 인스턴스로 보는 것이다.

  • 메서드
    어떤 작업을 하는 코드를 한번에 묶어 놓은 것이라고 보면 된다. 그렇다면 메서드가 왜 필요한가 ?
    1) 재사용성
    메소드를 만들어 놓으면 반복적으로 사용이 가능하다. 다른프로그램에서도 사용이 가능
    2) 중복된 코드 제거
    프로그램을 작성하다보면 같은 코드가 여러번 반복되어 작성되곤 하는데, 이럴때 메소드를 활용하면 중복된 부분을 없앨수있어서 효과적이다.
    3) 프로그램 구조화
        int[] heights = new int[5]; // 키가 들어가 있는 배열
        initHeight(heights); // 1. 키에 대한 초기화
        sortHeight(heights); // 2. 키를 오름차순으로 정렬
        printHeight(heights); // 3. 정렬된 키를 출력
    이와같이 어떤 작업을 하느냐에 따라서 구분이 되어 구조화가 된 것을 확인할 수 있다.
    +메소드 기본 약속
    1. 동사로시작하기
    2. camelcase로 작성하기!

객체지향언어 (2) 생성자

  • 생성자
    생성자는 뭐냐?! 인스턴스가 생성될수있도록 인스턴스를 초기화 하는 메소드이다.
    클래스이름 (타입 변수명, 타입 변수명, ...){
        인스턴스 생성 될 때에 수행하여할 코드
        변수의 초기화 코드
    }
    기본 형식이고, 생성자의 이름은 클래스명과 같아야하고, 생성자는 리턴값이 없다.
  • 인스턴스 멤버 변수의 기본값
 class DefaultValueTest {
    byte byteDefaultValue;
    int intDefaultValue;
    short shortDefaultValue;
    long longDefaultValue;
    float floatDefaultValue;
    double doubleDefaultValue;
    boolean booleanDefaultValue;
    String referenceDefaultValue;
}

public class Main {
    public static void main(String[] args) {
        DefaultValueTest defaultValueTest = new DefaultValueTest();
        System.out.println("byte default: " + defaultValueTest.byteDefaultValue);
        System.out.println("short default: " + defaultValueTest.shortDefaultValue);
        System.out.println("int default: " + defaultValueTest.intDefaultValue);
        System.out.println("long default: " + defaultValueTest.longDefaultValue);
        System.out.println("float default: " + defaultValueTest.floatDefaultValue);
        System.out.println("double default: " + defaultValueTest.doubleDefaultValue);
        System.out.println("boolean default: " + defaultValueTest.booleanDefaultValue);
        System.out.println("reference default: " + defaultValueTest.referenceDefaultValue);
    }
}

  
 byte default: 0 // 1byte 를 구성하는 8개의 bit가 모두 0이라는 뜻.
short default: 0
int default: 0
long default: 0
float default: 0.0
double default: 0.0
reference default: null
 

따로 설정해주지 않으면 이렇게 기본값으로 생성되어있다. 마지막 String reference는 "null"이아니라 그냥 없다는 null의 의미이다.

객체지향언어 (3) 상속


상속을 보여주는 UML class Diagram이다. 자동자의 하위계층으로 suv와 sedan이 존재하며 이렇게 계층적인 구조를 나타낸다.

상속이란 기존의 클래스를 재사용하는 방식중의 하나로, 한번 작성한 코드가 재사용이필요할때 변경사항만 추가해서 코드로 작성하면 되므로, 적은 양의 코드를 작성할 수 있게 되고, 이렇게 코드를 재사용하면서 코드와 클래스가 많아질수록 관리가 용이하다는 장점!

상속을 통해서 클래스간의 계층 구조를 만들게 되는데
1) 부모클래스의 정의된 필드와 메소드를 물려받는다.
2) 새로운 필드와 메소드를 추가할수있다.
3) 부모클래스에서 물려받은 메소드를 수정할수있다!

상속하는 부모클래스, 상속받는 자녀클래스!

class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}

이렇게 개와 고양이와 같은 자녀클래스들은 부모 클래스인 동물로부터 상속을 받는다고 표현한다.

  • 오버로딩 OVERLOADING
    한 클래스 내에 동일한 이름의 메소드를 여러개 정의하는 것
    동일한 이름의 메소드를 정의한다고 해서 무조건 오버로딩은 아니다.

  • 오버로딩 조건
    1) 메소드 이름이 동일해야 한다
    2) 매개변수의 개수 혹은 타입이 달라야 한다.

int add(int x, int y, int z) {
    int result = x + y + z;
    return result;
}

long add(int a, int b, int c) {
    long result = a + b + c;
    return result;
}

반환타입은 다르지만 매개변수의 자료형과 개수는 같기에 오버로딩이 아님

int add(int x, int y, int z) {
    int result = x + y + z;
    return result;
}

long add(int a, int b, long c) {
    long result = a + b + c;
    return result;
}

int add(int a, int b) {
    int result = a + b;
    return result;
}

// 이것이 오버로딩의 이다! 반환타입도 다르고, 매개변수 자료형도, 개수도 다름

  • 오버라이딩 OVERRIDING
    부모 클래스로부터 상속받은 메소드의 내용을 변경하는 것
    상속받은 메소드를 그대로 사용하기도하지만, 필요에 따라서 변경해야할 경우 오버라이딩이라고 한다.

  • 오버라이딩의 조건
    1) 부모 클래스의 메소드와 이름이 같아야 한다.
    2) 부모 클래스의 메소드와 매겨변수가 같아야 한다.
    3) 부모 클래스의 메소드와 반환타입이 같아야 한다.
    보통 상속받은 자녀의 메소드가 실행되는것이 오버라이딩!

    오버로딩: 기존에 없는 새로운 메소드를 정의하는데 같은 이름을 가진 함수를 정의
    오버라이딩: 부모클래스에 있는 함수를 자식클래스에서 똑같이 구현해서 부모에 있는 함수를 없는 것 체 하는 것이다.

객제지향 언어(4) 접근제어자

  • 접근제어자
    접근제어자는 멤버 변수, 함수, 혹은 클래스에서 사용되고 외부에서의 접근을 제한하는 역할을 한다.

private : 같은 클래스 내에서만 접근이 가능
default(nothing) : 같은 패키지 내에서만 접근이 가능
protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능
public : 접근 제한이 없음

(좁음) -> (넓음)
private → default → protected → public

  • 왜 접근 제어자를 사용할까 ?
    • 객체지향 프로그래밍이란 객체들 간의 상호작용을 코드로 표현하는 것이다.
    • 이때 객체들간의 관계에 따라서 접근 할 수 있는 것과 아닌 것, 권한을 구분할 필요가 생김
    • 클래스 내부에 선언된 데이터의 부적절한 사용으로부터 보호하기 위해서!
    • 이런 것을 캡슐화(encapsulation)라고 한다.
    • 접근 제어자는 캡슐화가 가능할 수 있도록 돕는 도구다!
profile
기록해야 (살아)남는다 !

2개의 댓글

comment-user-thumbnail
2022년 5월 18일

슈크림 붕어빵 땡기네요 책임지세요

1개의 답글