Java

    [Java] 디미터의 원칙

    디미터의 원칙이란? 특정 객체가 다른 객체의 정보를 너무 많이 알다 보면 결합도가 높아지면서 문제를 야기한다. 이러한 문제를 개선하기 위해 객체에게 자료를 숨기는 대신 함수를 공개하는 것을 디미터의 원칙이다. 본인이 아니라 협력하는 객체의 내부 구조에 대해 알다보면 결합도가 생기는데, 이때 강하게 결합되지 않도록 협력 경로를 제한하는 원칙이다. 즉, 자기 소유의 장난감, 자기가 만든 장난감, 그리고 누군가 자기에게 준 장난감하고만 놀 수 있다. 하지만 절대 장난감의 장난감과 놀면 안 된다. 객체 지향 생활체조 원칙의 한줄에 점을 한 개만 찍는다. 원칙으로도 불리운다. 디미터의 원칙을 지키지 않는 경우 더 자세히 살펴보자. 보통 getter()를 사용해서 다른 객체의 값을 많이 가져오는데, 본인을 제외한 ..

    [Java] 인터페이스

    인터페이스란? 만약 사람이 움직이는 것을 코드로 구현할 때, 사람은 걷기 뛰기 달리기 등 다양한 동작이 가능하다. 이러한 행동들을 필요할 때마다 추가를 한다면 코드를 작성하는 입장에서 굉장히 번거로울 것이다. 인터페이스를 사용하면 이러한 번거로움이 없어진다. 즉, 사람과 행동 사이에 중개자 역할을 담당하는 것이 인터페이스다. 그리고 행동에 필요한 틀을 선언해 놓아 구현을 강제한다. 장점 - 중개자를 통해 코드를 작성하기 때문에 동시 작업이 가능해진다. (만약 중개자가 없는 상태에서 동시개발을 진행한다면 추가로 변경해야 하는 부분이 생겨 꼬일 수 있다.) - 선언과 구현이 분리되어 있기 때문에 구현 부분을 수정해도 다른 클래스에 영향을 미치지 않는다. - 코드 변경 없이 다양한 실행 내용이나 결괏값을 구할..

    [Java] Object(toString(), equals(), hashCode())

    Object가 모든 클래스의 조상 클래스는 사실을 사람들이 잘 모를 수 있다. 모든 클래스가 Object를 상속받고 있지만, 생략되어 있기 때문에 관련 내용을 보지 않았다면 알 수가 없다. 나 또한 처음에는 알지 못했다. 그래서 모든 객체는 Object의 메소드를 모두 호출해 사용할 수 있다. 총 11개의 메서드로 구성되어 있는데, 이 중 몇 가지를 살펴보고자 한다. toString() - 기본 동작 : 객체의 해시코드 출력(클래스명@16진수해시코드) equals() 메소드 다음으로 가장 많이 사용했던 메소드다. 나는 문자열이 아닌 변수를 문자열로 변환시킬 때 많이 사용했다. 그래서 당연히 문자열을 리턴하는 역할로 알고 있었지만 원형은 달랐다. 예시를 살펴보자. 아래와 같이 객체에 toString()을 ..

    [Java] StringBuilder vs StringBuffer

    Java로 코딩 테스트를 준비하다 보면 문자열 문제를 많이 마주한다. 이때, 기본 String을 사용하기도 하지만 StringBuilder와 StringBuffer를 사용하는 경우도 많다. 이 두가지에 대해 알아보도록 하자! String String과 2개 클래스의 차이를 보면 불변함의 차이가 있다. String : 불변(immutable) String 객체는 한 번 생성되면 할당된 메모리 공간이 변하지 않는다. 즉, +연산을 사용했을 때 기존의 문자열에 문자를 덧붙이는 것이 아니라 덧붙여진 새로운 String 객체를 만드는 것이다. 이것은 메모리 측면에서 굉장히 비효율적이다. 위와 반대로 간단하게 사용하거나, 동기화에 대해 신경쓰지 않아도 되는 경우에는 불변함이 장점이다. 자바에서 String은 Hea..

    [Java] Solid란?

    Solid를 쓰는 이유? 객체지향 설계가 더 쉬워지고, 유지보수와 확장도 쉬워짐 1. SRP(Single Responsibility Principle) : 단일 책임 원칙 "어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다." - 하나의 객체가 하나의 책임을 갖는 것 - 즉, 하나의 객체가 자신이 할 수 있는 것과 해야 하는 것만 수행할 수 있도록 설계되어야 한다! SRP를 지켜야 하는 이유 응집도와 결합도 관점에서 접근해야 한다. 응집도 - 한 프로그램 요소가 얼마나 뭉쳐있는가를 나타내는 척도. - 응집도가 높은 클래스는 하나의 책임에 집중하고, 독립성이 높아져 재사용이나 기능의 수정, 유지보수가 용이하다. 결합도 - 클래스 간의 상호 의존 정도. - 결합도가 낮으면 클래스간의 상호 의존성이 ..

    [Java] 다형성, 캐스팅, 추상 클래스, 추상 메서드

    다형성이란? 동일한 타입을 사용하지만 다양한 결과가 나오는 성질 실행 도중에 어떤 객체를 필드로 사용하느냐에 따라 결과가 달라짐 자동 형변환을 이용해 필드값을 변경하면 메서드를 수정 안 해도 다양한 결과를 얻을 수 있음 ex) 컴퓨터는 저장소, 그래픽 카드 등의 객체를 보유하고 있다. 하지만, 사용하면서 부품을 교체해가면서 사용한다. 새로운 부품은 기존과 동일하지만 실행 결과는 더 좋게 나온다. 캐스팅(Casting) : 강제 타입 변환 부모 타입을 자식 타입으로 변환하는 것 자식 타입이 부모 타입으로 자동 형변환한 후, 본래 타입으로 변환할 때 본인의 필드나 메서드 사용이 가능해짐 추상 클래스 클래스들의 공통 특성을 추출해 선언한 클래스 실체 클래스와 상속 관계 추상 클래스가 부모, 실체 클래스가 자식..

    [Java] 상속, final, 자동 형변환

    상속이란? 부모 클래스의 필드와 메서드를 자식 클래스에게 물려주는 것 필드와 메서드를 재사용해 코드의 중복 줄여줌 부모 클래스만 수정하면 상속받는 자식 클래스도 영향받기 때문에 수정 횟수도 최소화됨 부모 클래스에서 private로 필드나 메서드를 선언하면 상속이 불가능함 부모 클래스와 자식 클래스가 다른 패키지에 존재하면 기본 접근 제한으로 선언된 필드와 메서드는 상속 대상에서 제외됨 자식 객체 생성 시 부모 객체가 먼저 생성된다. 부모 생성자는 자식 생성자의 제일 첫 줄에서 호출된다.(아래의 super()) class BJ { String name; BJ(String name) { this.name = name; } } class Temp extends BJ { int num; Temp(String n..

    [Java] 객체지향 프로그래밍(OOP)이란?

    객체지향 프로그래밍이란? 부품에 해당하는 객체들을 먼저 만들고, 프로그램을 객체로 구성하는 것 프로그램 규모가 커지면서 생각한 해결책이 '프로그램을 작게 나눠서 만들고, 합치자!'이다. 각각의 객체는 맡은 작은 기능을 수행하고, 서로 협력해 큰 규모의 프로그램이 되는 것이다. 이 과정에서 굉장히 많은 객체가 존재할 수 있기 때문에 객체를 서로 구분해야 한다. 결국, 각 객체들에게 기능을 제공하는데 어떤 책임을 부여하고 어떻게 협력을 할지 정하는 것이 객체지향 프로그래밍이다! 객체란? 자신의 속성을 가지고 있고 다른 친구들과 식별 가능한 것으로 작은 기능을 수행한다. 프로그램을 만들 때 객체를 서로 구분해야 하는데, type(형)으로 구분한다. 타입을 만든다는 것은 클래스를 만드는 것과 같다. ex) St..