본문 바로가기
lang/java

[TIL]01 객체지향 맛보기

by SHplusR 2023. 6. 2.

 

자바 마스터북이라는 책을 샀다!!

서점에서 보고 괜찮은것같아서 샀는데 정말 

>> 초보는 아니지만 그렇다고 고급도 아닌 개발자가 좋은 코드를 짜기에 좋은 팁들이 모여있는 책<<

이라는 말이 잘 어울리는 책이다..

나도 코테 공부를 하며 연습을 할 때, 코드가 통과되는것에만 열을 올렸던 적이 있는데

책을 읽고 아..그렇게 하면 메모리/시간이 엄청 낭비되는구나...를 알 수 있게 되었다. 

 

각설하고.. 자바의 큰 특징인 객체지향에 대해서 공부했다. 

------------------------------------------------------------------------------

 

보통 외부에서 객체지향에 대해 배우면 교수님들/선생님들은 모두 '붕어빵'을 예로 드신다.

 

붕어빵을 만드는 틀 : class

붕어빵 : object (객체)

->> 대충 붕어빵틀로 붕어빵을 여러개 만들 수 있는듯이 객체 생성할 수 있단 이야기..

근데 난 이런 예시보다는 class의 복제판을 만든다. 라고 생각하는게 더 이해가 잘 된다

 

메서드를 호출할때의 인수에 값을 전달하거나 변수에 값을 대입할때 아래의 두가지 방법이 있다.

 

1) 기본으로 값 전달

2) 참조로 값 전달

 

2가 객체지향을 사용하는 예이다.

public class Entity {
    public int value;
}
public class CallReference {
    public static void main(String[] args) {
        Entity entity = new Entity();
        entity.value = 1;
        calledReference(entity);
        System.out.println("callReference에서 entity : " + entity.value);
    }
    public static void calledReference(Entity entity){
        entity.value *= 2;
        System.out.println("calledReference에서 entity : " + entity.value);
    }
}

결과값) 

calledReference에서 entity : 2
callReference에서 entity : 2 

 

이 경우, call과 called 모두 같은 entity.value 값이 나온다. 객체 자체가 아니라 객체에 대한 참조를 나타내는 값을 전달하여,

호출된 메서드(called) 의 변경사항이 호출자(call) 에 반영이 된다. 

 

객체지향의 잘 알려진 4가지 특징은 아래와 같다.

 

 1) 추상화

객체들의 공통적인 기능 / 요소를 추출하는것을 의미한다.

추상화를 표현하는 방법은 abstract class , interface 2가지 방법이 있다.

abstract class interface
1. 일반메소드도 같이 사용가능
2. 다중상속 X
1. abstract method만 사용가능
2. 다중상속 가능

추상화를 하게 되면

1. 중복되는 코드를 줄일 수 있다.

2. 코드가 간결해진다. 등의 특징이 있다. 

 

abstract) 

abstract class animalsample{
    abstract void howl();
    int legs = 4;
    boolean tail = true;
}
class Cat extends animalsample{

    @Override
    void howl() {
        System.out.println("냥");
    }
}

class Dog extends animalsample{
    @Override
    void howl(){
        System.out.println("멍");
    }
}

혹은 이렇게 표현할 수 있다.

interface )

public interface animalsamp {
    void howl();
}
class Cat implements animalsamp{
    @Override
    public void howl() {
        System.out.println("냥이야");
    }
}

class Dog implements animalsamp{
    @Override
    public void howl() {
        System.out.println("멍이야");
    }
}

2) 상속

-> 사실 위의 추상화에서 이미 예시를 들었다.

상속은 기존의 클래스를 재활용하여 새로운 클래스를 작성하는것을 의미한다.

개와 고양이는 다리가 4개이며, 꼬리가 있고, 울음소리가 있다는 특징이 공통된다. -> 이러한 공통사항을 한곳에 모아두고, 

이를 재활용해서 개와 고양이class 에서 재활용할 수 있다.

 

 3) 다형성

-> 이것도...위의 예시에 나와있다. 

개와 고양이는 많은 부분이 공통되지만 다른점도 분명히 존재한다.

대표적으로는 울음소리가 있다. 개는 멍!하고 울지만 고양이는 냥~하고 운다. 

하지만 super class인 animalsample에는 howl 메소드가 있는데, 이는 개 클래스와 고양이 클래스에서 다르게 활용된다!

이를 다형성이라고 한다..

 

4) 캡슐화

캡슐화란 관련 있는 속성과 기능들을 하나의 캡슐로 만드는것을 뜻한다.

캡슐화를 하면

1) 데이터 은닉화

2) 데이터 보호 

가 가능하다. 

예를들어 

 

class Book {
    int price = 1000;
    public int booksPrice(){
        return price *= 0.9;
    }
}
public class Main{
    public static void main(String[] args)  {
        Book book = new Book();
        book.booksPrice();
    }
}

가 있다. 이때 책의 가격이 10%할인이 아니라 20,30..등 몇퍼 할인이 되든 나는 booksPrice() 안의 숫자만 바꾸면 되기때문에 아주 편해진다. 이처럼 캡슐화는 데이터를 처리하는 방식/값이 겉으로 드러난게 아니라 객체 자체에서 이루어진다!

'lang > java' 카테고리의 다른 글

[java] map 까보기  (1) 2023.10.20
[TIL]06 익명클래스, Nested class  (0) 2023.06.10
[TIL]02 자바의 문법은 뭘까?  (0) 2023.06.03
[baekjoon] Scanner, BufferedReader 중 어느것을 써야할까  (0) 2023.05.15