ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 4주차 개념노트
    메가테라 2022. 9. 11. 13:45

    build

    소프트웨어에 필요한 수 많은 파일들(소스 코드 + 리소스)을 변형 또는 압축하는 과정을 의미한다.

    소스 코드를 실행할 수 있는 상태로 만들어주는 것도 빌드이고,

    코드들을 압축해서 전체 크기를 줄이거나 난독화하는 과정도 빌드에 해당한다.

    컴파일 언어의 경우 컴파일이 당연히 build과정에 포함된다.

    배포(개발한 프로그램을 사용자에게 전달)하기 위해서는 빌드 과정이 필요하다.

    Gradle등의 빌드 도구를 이용해서 빌드할 수 있다.

    배포

    빌드한 결과물을 사용자에게 전달하는 것을 의미한다.

    사용자들이 다운로드할 수 있는 곳(구글 플레이 등)에 업로드하거나

    웹사이트의 서버에 올려서 웹사이트에 개발한 것을 반영하는 것을 의미한다.

    jar 파일

    소스 코드와 리소스들을 한 개의 파일로 모은 파일이다.

    프로그램을 위한 모든 것을 jar 파일 하나로 묶으면 관리하기가 편하고, 그 상태로 배포하기도 용이하다.

    jar명령어로 JAR파일을 만들거나 압축을 풀 수도 있다.

    https://www.nicepng.com/ourpic/u2t4i1w7a9t4t4r5_pooh-face-sitting-with-honey-pot-winnie-the/

    Gradle

    그루비를 이용한 빌드 자동화 시스템이다.

    안드로이드 앱을 만들려면 필요한 안드로이드 스튜디오의 공식 빌드 시스템이다.

    여러가지 언어를 지원한다.

    비슷한 툴인 Maven보다 속도가 훨씬 빠르다.

    Gradlew

    Gradle wrapper script이다.

    Gradle을 쉽게 쓸 수 있게 해준다.

    Gradle 프로젝트 구조

    https://www.javatpoint.com/gradle-java-application

    build.gradle로 빌드 설정을 할 수 있다.

    build.gradle안에는 Project object의 메서드들을 사용할 수 있다.

    대표적인 메서드에는 plugins, dependencies, application, test 등이 있다.

    setting.gradle에는 rootProject와 module등을 써둘 수 있다.

    프로그램 코드는 src/main/java안에 작성하고,

    프로그램 코드를 위한 테스트 코드는 src/test/java에 작성한다.

    상속(Inheritance)과 위임(Delegation)의 차이점

    상속은 한 클래스가 다른 클래스의 한 종류(IS-A관계)일 때 사용할 수 있다.

    상속을 하면 상당히 많은 제약이 있기 때문에(부모 클래스가 변경되면 자식 클래스도 모두 변경해야 되는 등) 코드 재사용의 목적으로 상속을 사용하면 안되지만, 상속을 사용하면 코드 재사용을 하기가 용이하다.

    상속 관계가 아닐 때 코드 재사용을 하고 싶은 경우 위임을 사용하면 된다.

    다른 클래스에 재사용하고 싶은 코드를 위임하고, 그 클래스를 매개변수로 받아서(의존성 주입) 쓰면 된다.

    참조, 참조 변수

    참조한다는 것은 주소 값을 바라보고 있다는 뜻이다.

    데이터를 많이 들고 있는 객체의 경우 객체를 들고다니기 보다는 객체가 있는 주소만 들고다니는 것이 메모리에 부담이 적기 때문에 변수에 인스턴스를 넣어주면 주소값을 참조하고 있는 참조 변수가 된다.

    ./gradlew 명령어

    • tasks
      • 사용할 수 있는 task들을 확인할 수 있다.
    • run
      • 빌드 후 rootProject를 실행한다.
    • test
      • 테스트 코드를 실행한다.
    • compileJava
      • 자바 파일을 컴파일 한다.
    • clean
      • 프로젝트를 빌드했을 때 생긴 build디렉토리를 지워준다.
    • assemble
      • jar파일로 묶어준다.
    • compileTestJava
      • 테스트 코드를 컴파일 해준다.

    JUnit5

    자바 유닛 테스트 프레임워크이다.

    프로그램이 원하는 기능을 제대로 수행하는지 Assertion을 통해 확인할 수 있다.

    생성자 메서드 오버로딩

    오버로딩은 동일한 메소드를 여러개 작성한 것이다.

    보통 매개변수 개수가 다른 경우 오버로딩을 하게 된다.

    생성자의 매개변수를 다양하게 받고 싶은 경우 생성자 메소드 오버로딩을 해주면 된다.

    패키지

    관심사가 같은 클래스들을 모아 둔 디렉토리이다.

    다른 패키지 내부에는 같은 이름의 클래스가 들어가도 괜찮다.

    프레임워크

    틀이라는 뜻을 갖고 있다.

    기본 골격을 프레임워크가 제공해주고, 프레임워크가 시키는 방식대로 코드를 짜면된다.

    프레임워크에서 여러 기능들을 제공해주기 때문에 프레임워크를 사용하면 개발 프로세스를 단축할 수 있고, 코드가 체계화 된다.
    보안 기능 등도 제공해주기도 한다.

    어노테이션

    특별한 제어자이다.

    다른 제어자들(public, static, final 등)이 쓰일 수 있는 곳에 쓰일 수 있다.

    @어노테이션 타입 으로 작성한다.

    컴파일러에게 정보를 알려주기도 한다.

    @Override, @Test @FunctionalInterface등등이 있다.

    테스트 주도 개발(Test Driven Development)

    테스트를 먼저 작성하고 테스트를 통과시키기 위해 코드를 작성하는 개발방식을 의미한다.

    테스트를 짜기 위해 인터페이스를 먼저 만들게 된다는 장점이 있다.

    TDD 사이클(RED→GREEN→REFACTOR)

    TDD를 할 때는 test를 코드보다 먼저 작성하므로 당연히 테스트가 돌아가지 않는다.

    이 때를 red단계라고 한다.(테스트가 돌아가지 않아서 빨갛게 워닝이 뜨므로)

    그 다음에는 코드를 제대로 짤 생각을 하기 보다는 어떻게든 테스트를 통과시키기 위한 코드를 짠다.

    그렇게 테스트를 통과하면 green단계가 끝난 것이다.

    이제 제대로 짜야 하는 refactor 단계를 거치고

    다음 기능을 위해 계속 이 과정을 반복해나가면 된다.

    https://sehun-kim.github.io/sehun/tdd/

    expression(식)과 statement(문)

    식은 값을 도출할 수 있는 코드이다.

    변수, 함수, 리터럴, 연산자 등으로 구성된다.

    2+3 등이 식에 해당된다.

    모든 식은 문이다.

    문은 컴퓨터에 내리는 명령이다.

    프로그램은 따라서 하나 이상의 문으로 이뤄져 있다.

    응집도와 결합도

    관심사의 분리와 관련이 있다.

    관심사의 분리가 잘 되어 있을 수록 응집도는 높고, 결합도는 낮다.

    응집도가 높고, 결합도가 낮을수록 유지보수가 편해진다.

    응집도가 높다는 말은 비슷한 내용끼리 같이 있다는 말이고,

    결합도가 낮다는 것은 응집된 것들 끼리 의존하고 있지 않고 잘 분리가 되어 있다는 말이다.

    추상화 레벨

    코드가 추상화된 정도를 의미한다.

    추상화 레벨을 맞춰주는 게 코드를 읽는 사람에게 자연스럽게 읽힌다.

    추상화 레벨이 동일하다는 것은 한 메소드 안에서 코드들이 모두 나열되어 있거나, 모두 메소드로 감싸져서 메소드가 나열되어 있는 경우를 말한다.

    라이브러리

    개발할 때 가져다 쓸 수 있는 자원이다.

    모든 것을 처음부터 끝까지 다 만드는 것보다는 라이브러리에서 적절한 것들을 가져다가 붙여서 쓰고,

    프로그램의 핵심적 부분에 집중해서 코드를 작성하면 좋다.

    내가 자주쓰는 코드들로 나만의 라이브러리를 만들 수도 있다.

    도메인

    소프트웨어로 해결하려고 하는 문제 영역을 의미한다.

    도메인 모델

    도메인을 추상화(간단화)한 것이다.

    실제에서 뺄 것은 빼고 우리가 집중하고자 하는 부분만 남겨둔 것이다.

    도메인에 대한 구체적인 설계이기 때문에 개념들의 관계를 표현하고, 그려서 시각적으로 표현할 수 있다.

    null

    객체에 값이 없는 것을 의미한다.

    NullPointerException

    Runtime Exception의 한 종류이다.

    null값이 아닌 객체가 있어야 하는 곳에, null값이 주어졌을 때 참조하려고 하면 발생한다.

    null에게 없는 인스턴스의 메소드를 부를 때,

    null에게 없는 인덱스로 null값을 참조하려고 할 때,

    null에게 없는 길이를 구하려고 할 때 등등

    null에게 없는 것을 하려고 할 때 발생한다.

    IndexOutOfBoundsException

    Runtime Exception의 한 종류이다.

    배열의 최대 인덱스를 벗어난 값을 받아오려고 할 때 발생한다.

    동일성과 동등성

    원시 타입의 경우 값이 같으면 동일하다고 할 수 있다.

    하지만 참조 타입의 경우 내용이 같더라도 동일하다고 할 수 없다.

    왜냐하면 객체마다 다른 메모리의 주소를 가리키기 때문이다.

    이름이 같은 사람 두 명이 동일하다고 할 수 없는 것과 마찬가지이다.

    하지만 이름이 같은지 확인하고 싶을 수 있고, 이 때 사용하는 개념이 동등성이다.

    값 객체(Value Object)

    식별자를 기반으로 equality를 판단하지 않고, 값이 같을 때 같은 객체로 판단하는 객체를 의미한다.

    예를 들어 1999년 1월 1일 객체를 두 개 생성했을 때 그 두 객체를 같다고 볼 수 있는 것은

    1999년 1월 1일 객체를 값 객체로 봤기 때문이다.

    오버라이딩(Overriding)

    상위 클래스를 상속받은 하위 클래스에서 상위 클래스의 메소드를 그대로 쓰기 싫을 때 재정의 해주는 것을 의미한다.

    덮어쓴다. 라고 생각하면 된다.

    가상 메소드 방식이 적용되므로 오버라이딩 했을 때 상위클래스 자료형으로 형 변환을 해줘도 오버라이딩된 메소드가 실행된다.

    즉, 메소드는 자료형과 관계 없이 인스턴스의 메소드가 실행된다.

    만약 오버라이딩 되지 않았다면 상위 클래스의 메소드가 실행된다.

    equals()와 hashCode()

    equals는 overriding(재정의)하지 않은 경우 == 와 같은 값을 반환한다.

    ==는 객체가 같은지 (참조하고 있는 주소가 같은지)를 반환해준다.

    따라서 우리가 만약에 두 객체가 같다고 보고 싶은 경우가 있어도 무조건 서로 다른 객체는 ==를 했을 때 false가 나오기 때문에

    equals를 우리 입맛에 맞춰 오버라이딩 해서 어떨 때 같다고 볼 지 재정의해줄 수 있다.

    hashCode는 객체의 해시코드(겹치지 않는 값)을 반환한다.

    해시코드가 같다면 같은 객체라고 인식할 수 있다.

    만약 같은 객체라면 해시코드도 같아야 한다.

    따라서 equals를 재정의해준 경우 equals로 같다고 나오는 객체들은 hashCode도 같은 값이 나오게 재정의해줘야 바람직하다.

    이 때 hashCode 반환 값으로는 equals에서 식별자(값이 같을 때 같다고 볼 수 있는 요소)로 선택한 값(예를 들면 id)을 주면 좋다.

    Integer와 int의 차이

    Integer는 Object를 상속한(사실 자바의 모든 타입은 Object타입의 상속을 받는다.) 타입이다. 

    따라서 Integer형 변수는 Object가 갖고있는 메소드들(toString 등)과 Integer가 갖고있는 메소드들을 사용할 수 있다.

    int는 primitive type이다. (객체가 아니다.)

    따라서 int형 변수는 객체가 아니므로 메소드를 갖고 있지 않아서 그 변수를 다른 자료형으로 변형시키거나 여러 작업을 하려면 Integer.~~(변수)처럼 Integer의 메소드들을 가져다 써야 한다.

    File 객체

    파일과 관련된 작업을 하기 위한 객체이다.

    파일 삭제, 이름 바꾸기, 생성 등등 파일과 관련된 작업들을 쉽게 도와주는 친구이다.

    댓글

Designed by Tistory.