클래스 정리

Lee Seung Jae·2022년 2월 21일
0
post-custom-banner

자바 클래스에 대해서 다시 정리할 필요성을 느꼈다.
도메인 분석을 통해 최소의 객체 단위로 분리하려면 그 객체 클래스마다 하는 기능을 정의해두고 지금까지 사용했던 Out-In 방식에서 In-Out방식으로 고쳐나가보려고 다시 정리해본다.

우선 부족한 것이 자꾸 앞 클래스에서 get메서드를 사용하는게 문제이지 않나 싶다.
get을 통해 다른 곳에서 값을 변경하는 것은 좋지 않은 방법인 것 같다.

어떤 로직을 구현함에 있어서 웹에서 잘 짜여진 API로직을 가공하려면 웹이 중요한게 아니라 일단 순수 자바가 더 중요한 것 같다. 요즘 그래서 기본부터 천천히 다시 공부중이다.

호출로 뭔가를 바꿔줄 수 있는 일을 하자...

위 문구를 계속 생각하자 ❗

객체란?

  • 객체(의미) : 자신을 제외한 대상
  • 자바에서의 객체 : 하나의 역할을 수행하는 메소드와 데이터(필드)의 집합체

객체 지향 프로그래밍의 특징

  • 캡슐화
    • 객체의 필드와 메소드를 묶고, 실제 구현 내용은 감추는 것
    • 외부 객체는 객체 내부의 구조를 알 수 없으며, 객체가 노출해서(흔히 말하는 public) 제공하는 필드와 메소드만 이용할 수 있다.
      • 여기서 위에서 말한 get메서드로 뭔가를 바꾸려는 것을 되도록이면 지양해야 한다.
      • 그냥 단순한 get메소드 그러니까 그 객체의 필드 변수를 그대로 반환하는 것을 말한다.
  • 상속
    • 부모 객체의 필드와 메소드를 상속받은 자식의 객체에서 그대로 사용할 수 있다.
  • 다형성
    • Override를 생각하면 된다.
      • 인터페이스에 메소드를 확립해놓고서 구현체를 여러개를 두었을 때 같은 타입이지만 하는 행위 즉, 반환값이나 안에 들어가는 구현식이 다를 수 있다.

객체와 클래스

클래스는 개발자의 설계도면이라고 봐도 되겠다.

예를 들어보자

public class Car {
  private String name;
  ...
}

이런 Car 클래스가 있다고 가정하면

실제 main 메소드에서

public static void main(String[] args) {
    Car car1 = new Car();
    Car car2 = new Car();
    Car car3 = new Car();
}

똑같은 Car 클래스 3개 이지만 이들은 각기 다른 인스턴스 이다.

그러니까 클래스를 설계도면이라고 치면 도면대로 만드는 것은 여러개를 만들 수 있으니까 그래서 도면이라고 칭했다.

자바의 개발 단계는
1. 클래스를 설계한다.
2. 클래스를 가지고 객체를 생성
3. 객체를 사용한다

이렇게 3단계이다. 단순하다.

항상 1단계를 잘 설계하자고 머릿속에 생각을 해야만 좋은 코드가 나올 것이라고 생각한다.

그리고 new 는 객체를 실제 생성시키는 역할을 하기 때문에 Car()는 생성자이고, 이 연산자로 생성된 객체는 힙 영역에 생성된다.

객체의 위치를 모르면 그 객체를 사용할 수 없기 때문에 스택에 넣지않고 힙에 적재해주는 것이다. 그래야 주소를 리턴해서 사용할 수 있으니까 말이다.

필드 사용

이제껏 그냥 넘어갔던 내용을 발견했다... 상당히 치명적이다. 기본 제대로 알고있지 않은것 같은..

필드에서는 선언시에

public class Car {
    String company = "kia";
    String model = "k3";
    int maxSpeed;
    int oil;
}

이런식으로 =을 사용해서 직접 초기화를 해줘도 되지만
아래의 maxSpeedoil처럼 자동으로 기본값 초기화가 되는데

간과했던 사실

로컬 변수는 항상 내가 선언만 했을 경우에는 nullPointerException이 발생했다.

public class Car {
    String company;
    ...
    
    public void move() {
        int speed;
        System.out.println(speed);
    }
}

이렇게 할 경우 에러가 발생한다.

지역 변수는 사용하기 전에 반드시 초기화를 해야한다!
이것을 넘어갔던 것이다. 그래서 에러를 많이 띄웠었다.

인터페이스도 다시한번 정리하는 시간을 가져야겠다. 😅

profile
💻 많이 짜보고 많이 경험해보자 https://lsj8367.tistory.com/ 블로그 주소 옮김
post-custom-banner

0개의 댓글