Annotation

📌 코드에 메타데이터를 추가할 수 있는 기능을 제공하며 주로 코드에 특별한 의미를 부여하거나, 컴파일러와 런타임에 특정 동작을 트리거하기 위해 사용된다.

  • 어노테이션은 코드에서 직접적인 로직 실행에 영향을 미치지 않지만, 코드의 의미를 설명하거나 추가적인 처리를 위해 사용됩니다.
  • "명함"를 생각하면 편하다. 이 명함은 "사람"에서 "프로그래머인 사람"이 된다. 사람이라는 정체성은 그대로이지만, 이 사람의 용도를 알 수 있다. 코드의 용도를 표시하며 실제로 컴파일러도 그 의미를 알지만 프로그램(사람) 자체에는 변화가 없다.

[1]  어노테이션 정의

  • 어노테이션은 @ 기호로 시작하며, 클래스, 메서드, 변수, 매개변수, 패키지 등에 추가할 수 있다.

[2]  내장 어노테이션

  • @Override
    • 메서드가 상위 클래스나 인터페이스의 메서드를 오버라이드하고 있음을 나타낸다.
      • 이때 컴파일러는 메서드가 실제로 오버라이드하고 있는지 확인한다.
  • @Deprecated
    • 해당 요소가 더 이상 사용되지 않음을 나타낸다.
    • 해당 어노테이션이 붙은 코드를 사용하면 컴파일 경고가 발생한다.
  • @SuppressWarnings
    • 컴파일러 경고를 억제한다.
      • 사용되지 않는 변수에 대한 경고를 무시할 수 있다.

[3]  사용자 정의 어노테이션

  • 개발자가 필요에 따라 직접 어노테이션을 정의할 수 있다.
  • 사용자 정의 어노테이션은 특정 메타데이터를 추가하거나,
  • AOP(Aspect-Oriented Programming) 같은 기술과 결합하여 다양한 기능을 구현할 수 있다.
    • AOP는 심화 주차에 배울 내용

 

Lombok

📌 Java에서 반복적인 코드를 줄여주는 라이브러리로, 코드의 가독성과 유지보수성을 높이는 데 도움이 됩니다. 주로 getter, setter, toString, equals, hashCode 메서드와 같은 보일러플레이트 코드를 자동으로 생성해줍니다.

 

[1]  Lombok 사용 시 장점:

  • 보일러플레이트 코드 감소: Lombok은 반복적인 코드(예: getter, setter, 생성자 등)를 자동으로 생성해 주어 코드가 간결해집니다.
  • 코드의 가독성 향상: 중요한 로직에 집중할 수 있어 코드가 더 깔끔하고 이해하기 쉬워집니다.
  • 생산성 향상: 반복적인 코드 작성에 소모되는 시간을 절약할 수 있습니다.

 

[2]   Lombok 사용 시 단점:

  • 자동 생성된 코드의 가시성 부족: Lombok은 컴파일 시 코드 생성이 이루어지기 때문에, IDE에서 코드가 어떻게 처리되는지 확인하기 어려운 경우가 있습니다.
  • 디버깅 어려움: Lombok이 생성한 코드는 실제로 파일에 존재하지 않기 때문에, 디버깅 시 자동으로 생성된 메서드를 추적하는 데 어려움이 있을 수 있습니다.

 

@Getter, @Setter

  • 클래스의 모든 필드에 대한 getter와 setter 메서드를 자동으로 생성한다.
  • 예시 코드
@Getter
@Setter
public class User {
    private String name;
    private int age;
  
  /** 아래 코드를 @Getter, @Setter 어노테이션이 생성해준다.
    public String getName() {
	    return name;
    }

    public void setName(String name) {
	    this.name = name;
    }
    
    public int getAge() {
	    return age;
    }

    public void setAge(int age) {
	    this.age = age;
    }
    **/
}

위 코드에서 getName(), setName(String name), getAge(), setAge(int age) 메서드가 자동으로 생성된다.



@ToString

  • 객체의 toString() 메서드를 자동으로 생성한다.
  • 기본적으로 클래스의 모든 필드를 포함하며, 특정 필드를 제외하거나 포맷을 지정할 수도 있다.
  • 예시코드
@ToString
public class User {
    private String name;
    private int age;
}
  • toString() 메서드는 객체를 String으로 변환해주는 역할을 수행한다.

@EqualsAndHashCode

  • equals()와 hashCode() 메서드를 자동으로 생성한다.
  • 객체의 동일성과 해시 코드를 정의하는데 사용된다.
  • 예시 코드
@EqualsAndHashCode
public class User {
    private String name;
    private int age;
}

 


 

@NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

  • 기본 생성자를 생성한다.
  • 모든 필드를 매개변수로 하는 생성자를 생성한다.
  • 필수(final) 필드만을 매개변수로 하는 생성자를 자동으로 생성한다.
  • 예시 코드
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String name;
    private int age;
}

 

@Data

  • @Getter, @Setter, @ToString, @EqualsAndHashCode,@RequiredArgsConstructor를 한꺼번에 적용하는 어노테이션이다.
  • 주로 테스트 용도로 사용한다.
  • 예시 코드
@Data
public class User {
    private String name;
    private int age;
}

@Builder

  • 빌더 패턴을 적용해 객체를 생성할 수 있게 합니다. 복잡한 객체 생성에 유용하며, 필드 이름을 명시적으로 지정하면서 객체를 생성할 수 있다.
  • 예시 코드
@Builder
public class User {
    private String name;
    private int age;
}
  • 사용 예시
User user = User.builder()
                .name("John")
                .age(30)
                .build();

@Slf4j

  • 클래스에 로그를 남기기 위한 Logger 객체를 자동으로 생성한다.
  • 예시 코드
@Slf4j
public class UserService {
    public void logMessage() {
        log.info("This is a log message");
    }
}

 

Framework

📌 프레임워크는 특정 프로그래밍 작업을 수행하기 위한 기반 구조를 제공하는 도구입니다. 예를 들어, 웹 애플리케이션 개발을 위한 Spring이나 Django와 같은 프레임워크는 애플리케이션 아키텍처구조를 정의하고, 개발자가 해당 구조 내에서 작업할 수 있도록 도와줍니다.

  • 프레임워크는 frame(틀) work(일하다)의 합성어로 일하기 위한 틀을 제공한다. 개발자는 해당 틀에서 일을 해야 한다.
  • 라이브러리가 도화지라면 프레임워크는 채색북과 같다. 둘다 그림을 완성시키는 도구이지만, 도화지는 완전히 자유로운 디자인을 할 수 있고 채색북은 자유롭지는 못하지만 편하게 그림을 완성시킬 수 있다.

 

[1] 프레임워크의 주요 특징:

  • 구조 제공: 프레임워크는 애플리케이션 개발의 기본 뼈대를 제공합니다. 예를 들어, 어떤 파일을 어디에 두고, 어떻게 코드를 구성할지에 대한 규칙을 제시합니다.
  • 규칙과 흐름: 프레임워크는 개발자가 따를 일정한 흐름을 정의합니다. 즉, 개발자가 애플리케이션을 어떻게 구조화할지에 대한 가이드라인을 제공합니다.
  • 확장성: 프레임워크는 애플리케이션을 개발하는 데 있어 기능을 추가하거나 수정할 수 있는 방법을 제공합니다. 그러나 기본적으로는 프레임워크 내에서 정해진 규칙을 따라야 합니다.
  • 재사용성: 프레임워크는 많은 기능을 미리 구현해두어, 개발자는 이러한 기능을 재사용할 수 있습니다. 예를 들어, 데이터베이스 연결, 보안 관리, 사용자 인증 등이 미리 구현되어 있는 경우가 많습니다.

[2] 프레임워크의 예시:

  • 웹 개발 프레임워크:
    • Spring Framework (Java): 웹 애플리케이션을 만들 때 필요한 기본 구조와 규칙을 제공합니다. Spring은 의존성 주입, AOP, 보안, 데이터베이스 연동 등 여러 기능을 제공합니다.
    • Django (Python): Python으로 웹 애플리케이션을 개발할 때 사용하는 프레임워크로, 기본적인 웹 애플리케이션의 구조와 URL 처리, 데이터베이스 연동 등의 기능을 제공합니다.
    • Ruby on Rails (Ruby): Ruby 언어로 웹 애플리케이션을 빠르게 개발할 수 있도록 도와주는 프레임워크입니다. RESTful 방식의 API 설계와 모델-뷰-컨트롤러(MVC) 아키텍처를 따릅니다.
  • 모바일 앱 개발 프레임워크:
    • React Native: JavaScript를 사용하여 iOS와 Android에서 실행되는 네이티브 앱을 개발할 수 있게 해주는 프레임워크입니다.
    • Flutter: Google에서 만든 프레임워크로, Dart 언어를 사용해 크로스 플랫폼 애플리케이션을 개발할 수 있습니다.

[3]  장점

  • 개발 프로젝트에 일관된 구조를 제공하여 코드의 일관성과 가독성을 높여주며 팀 협업이 편해진다.
  • 기본적으로 필요한 기능과 도구를 제공하여 개발자들이 핵심 비즈니스 로직에 집중할 수 있다.
  • 보안 관련 기능을 기본적으로 제공하여, 보안 취약점을 방지하는 데 도움을 준다.
  • 통합된 테스트 환경과 도구를 제공하여 테스트를 쉽게 작성하고 실행할 수 있다.
  • 인기 있는 프레임워크는 방대한 커뮤니티 지원을 받으며, 다양한 문서를 활용할 수 있다. 

[4]  단점

  • 프레임워크는 굉장히 복잡한 구조를 가지기 때문에, 처음 익히는 데 시간이 많이 소요된다.
  • 프레임워크의 새로운 버전이 기존 코드와 호환되지 않을 수 있다.
  • 정해진 규칙과 구조를 따르게 강제하여 자유롭게 변경하기 어려울 수 있다.

 

 

Library

📌 특정 기능을 수행하는 코드의 모음으로, 개발자가 필요할 때 그 기능을 호출하여 사용할 수 있는 도구입니다. 라이브러리는 애플리케이션의 흐름을 제어하지 않으며, 개발자가 원하는 기능만 골라서 사용할 수 있습니다. 즉, 라이브러리는 필요한 도구를 제공하지만, 애플리케이션의 전체적인 흐름은 개발자가 주도합니다.

 

[1] 라이브러리의 주요 특징:

  • 선택적 사용: 라이브러리는 개발자가 필요한 기능을 원할 때 호출해서 사용할 수 있습니다. 개발자가 전체적인 흐름을 제어하고, 필요한 기능만 사용할 수 있습니다.
  • 재사용성: 특정 기능을 여러 번 사용할 수 있도록 기능을 모듈화하여 제공합니다. 예를 들어, 수학 계산, 문자열 처리, HTTP 요청 보내기 등의 기능을 쉽게 사용할 수 있습니다.
  • 독립적: 라이브러리는 보통 독립적으로 동작하며, 다른 라이브러리나 애플리케이션에 종속되지 않습니다.

[2] 라이브러리의 예시:

  • JavaScript 라이브러리:
    • jQuery: HTML 문서를 다루고, 이벤트를 처리하며, AJAX 요청을 보내는 등의 기능을 쉽게 사용할 수 있도록 도와주는 JavaScript 라이브러리입니다. jQuery를 사용하면 DOM 조작을 더 간단히 할 수 있습니다.
    • Lodash: 배열, 객체, 함수 등의 데이터를 쉽게 다룰 수 있는 JavaScript 유틸리티 라이브러리입니다. 반복적인 코드 작성을 줄여주고, 다양한 유틸리티 함수들을 제공합니다.
  • Python 라이브러리:
    • NumPy: 수치 계산을 위한 Python 라이브러리로, 다차원 배열행렬 연산을 지원하여 과학적 계산을 손쉽게 할 수 있습니다.
    • Pandas: 데이터를 다루고 분석하는 데 유용한 라이브러리로, 데이터 프레임(DataFrame) 구조를 사용하여 데이터 처리 및 분석을 쉽게 합니다.
  • Java 라이브러리:
    • Apache Commons: 다양한 유틸리티 기능을 제공하는 Java 라이브러리로, 문자열 처리, 파일 입출력 등 여러 가지 기능을 간편하게 사용할 수 있습니다.
    • Google Guava: Java에서 컬렉션, 캐시, 문자열 처리 등을 편리하게 처리할 수 있도록 돕는 라이브러리입니다.

[3] 라이브러리 사용의 장점:

  • 빠른 개발: 이미 구현된 기능을 가져다 쓸 수 있어 개발 속도가 빨라집니다.
  • 모듈화: 필요한 기능만 가져다 쓰므로 코드가 깔끔하고 모듈화가 잘 됩니다.
  • 다양한 기능: 특정 작업을 처리하는 다양한 라이브러리가 존재하여, 원하는 기능을 쉽게 찾아 사용할 수 있습니다.

 

[4] 라이브러리 사용의 단점:

  • 라이브러리가 업데이트 되거나 지원이 중단될 경우 문제가 발생할 수 있다.
  • 버전 호환성 문제로 인해 다른 라이브러리나 기존 코드와 충돌이 발생할 수 있습니다.
    • 생각보다 빈번하게 발생하는 문제
  • 불필요한 기능을 포함한 라이브러리를 사용하면 비효율적이다.
  • 라이브러리의 내부 구현을 직접 수정하기 어려워, 특정 요구 사항에 맞게 조정하기 힘들 수 있다.

 

라이브러리와 프레임워크의 차이점을 표로 정리하면 다음과 같습니다:

  라이브러리 프레임워크
제어의 흐름 개발자가 흐름을 제어하고, 필요한 기능을 호출 프레임워크가 흐름을 제어하고, 개발자는 그 안에서 작업
사용 방식 필요한 기능을 선택하여 사용 전체적인 구조를 따르고, 규칙에 맞춰 작업
의존성 독립적이며, 필요할 때마다 호출하여 사용 애플리케이션 구조에 강하게 의존
구조 제공 여부 특정 기능을 제공하지만, 전체 구조는 제공하지 않음 전체적인 애플리케이션 구조를 제공
사용 예 특정 기능만 필요할 때 (예: jQuery, Lodash) 애플리케이션 개발 시 기본적인 구조가 필요한 경우 (예: Spring, Django)
개발자 역할 개발자가 원하는 기능을 필요에 맞게 선택하고 적용 개발자는 프레임워크의 규칙에 따라 작업
예시 jQuery, NumPy, Google Maps API Spring, Django, Ruby on Rails

요약:

  • 라이브러리는 개발자가 필요한 기능을 선택하여 사용하는 도구이고, 흐름 제어는 개발자에게 있습니다.
  • 프레임워크는 애플리케이션의 구조와 흐름을 제공하며 라이브러리를 이미 포함하고 있습니다. 흐름 제어는 프레임워크가 담당합니다.

프로그래밍 명명규칙(Casing)

📌 프로그래밍에서 변수, 함수, 클래스 이름 등을 작성할 때 일관성을 유지하기 위한 규칙입니다.

  • 명명 규칙은 코드의 가독성을 높이고, 유지 보수를 쉽게 하기 위해 사용됩니다.

[1] 주요 명명 규칙과 특징:

  1. 카멜 표기법(Camel Case):
    • 첫 단어는 소문자, 이후 단어는 첫 글자 대문자로 작성합니다.
    • 주로 변수명이나 함수명에 사용합니다.
    • 예: myVariableName, calculateTotal.
    💡 비유: 단어가 마치 낙타(Camel)의 등처럼 올라갔다 내려가는 모양.

  1. 파스칼 표기법(Pascal Case):
    • 모든 단어의 첫 글자를 대문자로 작성합니다.
    • 주로 클래스명이나 타입명에 사용합니다.
    • 예: MyClassName, EmployeeDetails.
    💡 비유: 낙타와 비슷하지만, 항상 등 위로 올라간다는 느낌.

  1. 스네이크 표기법(Snake Case):
    • 모든 단어를 소문자로 작성하고, 단어 사이를 밑줄(_)로 연결합니다.
    • 주로 변수명이나 상수명(특히 언어에 따라 다름)에 사용합니다.
    • 예: my_variable_name, total_sum.
    💡 비유: 단어들이 뱀처럼 구불구불하게 이어져 있음.

  1. 대문자 스네이크 표기법(Screaming Snake Case):
    • 모든 단어를 대문자로 작성하고, 밑줄(_)로 연결합니다.
    • 주로 상수명에 사용합니다.
    • 예: MAX_VALUE, DEFAULT_CONFIG.
    💡 비유: 뱀이 "소리치는(Screaming)" 것처럼 대문자로 강조됨.

  1. 케밥 표기법(Kebab Case):
    • 모든 단어를 소문자로 작성하고, 단어 사이를 하이픈(-)으로 연결합니다.
    • 주로 URL 경로나 파일 이름에서 사용합니다.
    • 예: my-variable-name, user-profile.
    💡 비유: 케밥 꼬치처럼 단어가 하이픈으로 연결되어 있음.

 

[2] 언어별 명명 규칙:

  • Java:
    • 클래스: Pascal Case (MyClass)
    • 변수/메서드: Camel Case (myVariable, calculateSum)
    • 상수: Screaming Snake Case (MAX_COUNT)
  • Python:
    • 변수/함수: Snake Case (my_variable)
    • 클래스: Pascal Case (MyClass)
    • 상수: Screaming Snake Case (PI_VALUE)
  • JavaScript:
    • 변수/함수: Camel Case (myFunction)
    • 클래스: Pascal Case (MyClass)

 

Java의 명명법

 

프로젝트, 레파지토리, 클래스, 상수, 변수 뒷부분만 대문자 사용

 

+ Recent posts