📚 참고자료

  • 유튜브 채널 [우아한 Tect] - 10분 테코톡 피카의 TDD와 단위 테스트

https://www.youtube.com/watch?v=3LMmPXoGI9Q 

 


 

🤔 TDD란?

 

프로그램을 작성하기 전에 테스트를 먼저 하라!

- 켄트 백 Kent Beck -

 

  • TDD (Test-Driven Development)
  • 테스트 코드를 먼저 만들고, 실제 프로덕션 코드를 나중에 만드는 개발 방법을 말합니다.

 

 

 

기존 프로세스

 

 

TDD 방식 프로세스

 

 

 

🤔 TDD를 사용하는 이유는?

  • 변화에 대한 두려움을 줄여준다. (리팩터링이 편하다)
  • 디버깅 시간을 줄여준다.
  • 동작하는 문서 역할을 한다.

 

 

 

😀 TDD의 장점

  • TDD를 하면 자연스레 테스트 커버리지가 높아진다.
  • 오버 엔지니어링을 방지할 수 있다.
    • TDD를 하면서 요구사항에 맞춰 개발 코드를 구현
    • 미래에 필요할 것 같은 구현을 지레짐작하여 불필요한 코드를 작성하는 소요가 줄어든다.
  • 설계에 대한 피드백이 빠르다.
    • 설계를 처음부터 잘한다면 좋겠지만 잘못 설계했다면, 변경이 일어나거나 사용하기 어려울 때 깨달을 수 있다.
      반면에 TDD는 설계에 대한 피드백을 빠르게 해 줄 수 있다.
    • 설계가 복잡해지면 테스트 코드를 작성하기 점점 더 어려워진다.

 

 

😅 TDD의 오해

  • TDD는 실제 방법론이다?
    • TDD는 높은 응집을 유도하지 않는다.
    • TDD는 단일 책임 원칙과 인터페이스 분리 원칙 위배에 어떤 신호도 주지 않는다.
    • TDD는 인터페이스 일관성을 도출하지 않는다.
    • TDD의 리팩터링 단계는 좋은 구조를 안내하거나 좋은 구조를 갖도록 강제하지 않는다.

 

 

 

😥 TDD를 실패하는 이유

  • 코드가 이루고자 하는 가치나 기능을 테스트하기보다 그 기능을 어떻게 구현하고 있는지를 테스트한다.
  • 결국 테스트 케이스들이 구현체와 결합도가 높아진다.
  • 구현체들을 리팩터링 하면 결합되어있는 테스트 케이스들이 모두 깨져버린다.

 

 

 

 

📏 테스트의 범위

 

  • 통합 테스트: 여러 작업 단위가 연계된 워크플로우를 테스트하기
    위한 수단(객체 간, 시스템 간)
  • 기능 테스트: 공개된 API의 가장 바깥쪽에 해당하는 코드 검사
    (Controller 호출, Security, http)
  • 부하 테스트: 주어진 단위 시간 동안 애플리케이션이 얼마나 많은
    요청을 처리할 수 있는지 검사
  • 인수 테스트: 고객 또는 대리인이 정의된 모든 목적에 부합되는지
    확인해보고자 하는 검사

 

 

 

 

 

👍 좋은 단위 테스트

 

F.I.R.S.T 법칙

F - Fast(빠르게)

I - Independent(독립적으로)

R - Repeatable(반복 가능하게)

S - Self-Validating(자가 검증하는)

T - Timely(적시에)

 

 

 


느낀점

  • 설계를 테스트로 검증 한다는 점이 설계에 대한 신뢰성을 더욱 올려줄 것 같습니다.
  • TDD의 장점과 정의는 많지만 어떻게 해야 하는지 아직 감이 안잡히고 있습니다.
    • 이건 TDD 수업을 해주는 교육기관에서 수업을 받아야 할 것 같습니다.
  • TDD는 아니더라도 테스트 코드를 성실하게 작성할 예정입니다.
    • 서비스단 메서드 하나에 하나의 테스트를 작성할 수 있도록 진행

 

 

 

반응형

 

 

📚 참고자료

  • 블로그 [망나니개발자] - [Spring] 설정 자동화와 설정의 변경, @EnableWebMvc와 WebMvcConfigurer => 링크
  • 블로그 [끝이 없는 배움의 끝] - Spring Boot로 CORS 해결하기 => 링크
  • 블로그 [개발하는 펭군이] - [Spring Boot] CORS 설정하기 => 링크

 

 

CORS가 무엇인가에 대한 것은 아래의 링크를 참고 부탁드립니다.

https://antstudy.tistory.com/259

 

CORS란?

참고자료 [MDN Web Docs] 교차 출처 리소스 공유(CORS) 블로그 [Evans Library] => CORS는 왜 이렇게 우리를 힘들게 하는 걸까? 우아한Tech 테코톡 => 나봄의 CORS # SOP SOP는 Same Origin Policy의 줄임말 다른..

antstudy.tistory.com

 


구글에 검색해보니, 다양한 방법으로 CORS를 설정하는 방법이 있었습니다.

 

저는 WebMvcConfigurer를 Implements 해서 addCorsMappings 메소드(함수)를 오버라이딩하는 방식을 사용했습니다.

 

 

✅ config 폴더에 MvcConfig 자바 파일 만들기

 

 

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
    	// addMapping: CORS를 적용할 URL패턴을 정의할 수 있습니다.
        registry.addMapping("/**")
        		// allowedOrigins: 자원 공유를 허락할 Origin을 지정할 수 있습니다.
                // - 아래와 같이 한번에 여러 Origin을 설정할 수 있습니다.
                .allowedOrigins("http://localhost:3000",
                        "http://localhost:8080",
                        "https://kauth.kakao.com/oauth/authorize/**",
                        "https://accounts.kakao.com/**")
                // allowedMethods: 허용할 HTTP method를 지정할 수 있습니다.
                // - 아래처럼 "*" 를 이용하여 모든 method를 허용할 수 있습니다.
                .allowedMethods("*")
                .allowedHeaders("*")
                .exposedHeaders(HttpHeaders.AUTHORIZATION);
    }
}

위 코드를 config 폴더 안에 있는 MvcConfig 파일과 코드를 추가해줍니다.

그러면 끝입니다.

* 꼭 config 폴더가 아니어도 괜찮습니다.

 

 

 

 

근데 여기서 드는 궁금한 점이 생겼습니다.

  • WebMvcConfigurer 무엇인지?
  • 왜 addCorsMappings 메소드를 override 해서 Origin을 설정하면 CORS 설정이 끝나는지?

그래서 WebMvcConfigurer에 대해 더 찾아봤습니다.

 


❓ WebMvcConfigurer 란?

  • WebMvcConfigurer는 자동 구성된 스프링 MVC 구성에 Formatter, MessageConverter 등을 추가 등록할 수 있다.
  • @EnableWebMvc가 자동적으로 세팅해주는 설정에 개발자가 원하는 설정을 추가할 수 있게 된다.

 

 

그러면 @EnableWebMvc 애노테이션이란?

  • SpringMVC에서 필요한 빈들을 등록하기 위해 @EnableWebMvc 애노테이션을 사용합니다.
  • @EnableWebMvc는 애노테이션 기반의 SpringMvc를 구성할 때 필요한 Bean 설정들을
    자동으로 해주는 애노테이션입니다.
  • 기본적으로 등록해주는 Bean들 이외에 추가적으로 개발자가 필요로 하는 Bean 등의
    등록을 손쉽게 할 수 있도록 도와줍니다.

 

 

 

 

 

반응형

 

 

 

📚 참고자료

  • 블로그 [호형] - Springboot에서 API Docs (Springdoc) 사용하는 방법 (1) => 링크
  • 블로그 [호형] - Springboot에서 API Docs (Springdoc) 사용하는 방법 (2) => 링크
  • 블로그 [soyeon207.log] - Swagger 란 ? (이론 + Spring boot 적용) => 링크
  • SpringDoc 공식 문서 => 링크

 

 

 

Spring2.6 버전 이상에서 springfox-boot-starter:3.0.0를 dependencies에 추가한 후,

애플리케이션을 Run 하면 아래와 같은에러가 떴습니다.

rg.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException: Cannot invoke "org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getPatterns()" because "this.condition" is null

 

검색해본 결과, Spring 2.6 버전과 springfox-boot-starter3.0.0 이 호환성 문제라는걸 알게되었습니다

 

 

 

여기서 해결책은

  1. Spring Boot 를 2.5x 버전대로 내리기
  2.  application.yml 혹은 application.properties에 설정 추가
  3. SpringDoc 을 사용하기(아래에 정리한 코드)

 

 

저는 2.5x 버전으로 내리거나 무언가(설정)을 추가하는 방식이 아닌 세번째 SpringDoc을 사용하는걸 선택했습니다.

 

 


1️⃣ build.gradle 의존성 추가

implementation "org.springdoc:springdoc-openapi-ui:1.5.9"

위 코드를 build.gradle안에 있는 dependencies에 추가해줍니다.

 

 

2️⃣ SwaggerConfig

@OpenAPIDefinition(
        info = @Info(title = "MatDi API",
                description = "MatDi API 명세서.",
                version = "v1"))
@Configuration
@RequiredArgsConstructor
public class SwaggerConfig {

    @Bean
    public GroupedOpenApi customTestOpenAPi() {
        // /test 로 시작하는 API 들을 테스트 관련 API 로 그룹핑
        // member 로 시작하는 API 를 그룹핑 하고 싶다 라고 하면 메소드 이름을 변경하고 하나 더 만들어서 설정하면 됨

        String[] paths = {"/test/**"};

        return GroupedOpenApi
                .builder()
                .group("MatDi API")
                .pathsToMatch(paths)
                .addOpenApiCustomiser(buildSecurityOpenApi()).build();
    }

    public OpenApiCustomiser buildSecurityOpenApi() {
        // jwt token 을 한번 설정하면 header 에 값을 넣어주는 코드, 자세한건 아래에 추가적으로 설명할 예정

        return OpenApi -> OpenApi.addSecurityItem(new SecurityRequirement().addList("jwt token"))
                .getComponents().addSecuritySchemes("jwt token", new SecurityScheme()
                        .name("Authorization")
                        .type(SecurityScheme.Type.HTTP)
                        .in(SecurityScheme.In.HEADER)
                        .bearerFormat("JWT")
                        .scheme("bearer"));
    }

}

Swagger를 설정 및 jwt token을 추가하는 코드입니다.

 

 

 

3️⃣ application.properties

springdoc.default-consumes-media-type= application/json
springdoc.default-produces-media-type= application/json
springdoc.swagger-ui.path= /swagger-ui.html
springdoc.swagger-ui.disable-swagger-default-url= true
springdoc.swagger-ui.display-query-params-without-oauth2= true

application.properties에 위에 해당하는 설정을 추가해줍니다.

 

 

4️⃣ Swagger 접속 URL

 

3.x : http://localhost:8080/swagger-ui/index.html

 

로컬 환경에서 애플리케이션을 Run 한다음에 위 url로 접속하면 됩니다.

 

 

 

 

 

 

반응형

항해99(부트캠프) 실전프로젝트

 

 

😄 JaCoCo를 이용한 Instruction Coverage 확인

 

- 총 25,289개의 라인 중 15,553개의 라인의 코드 커버리지(61%)를 달성했습니다.

- 코드의 안정성을 높이기 위해 최대한 커버리지를 높이려고 노력했습니다.

- 코드 커버리지를 높임으로써 코드 수정 시 버그 발견이 수월해졌습니다.

- 테스트 코드를 작성 하면서 총 서비스 로직에서 3개의 버그를 발견하고 수정했습니다.

 

 

 

😆 소셜로그인 API 제외 시 72% 달성

 

- 소셜로그인 API를 Mock으로 처리하려고 찾아봤지만 자료가 너무 적고 방법을 찾지 못했습니다.

- 결국 소셜로그인 API를 JaCoCo(코드 분석 도구)에서 제외 하는 방법을 찾아 적용했습니다.

 

 

 

 

반응형

 

 

 

🤔 팀프로젝트 중 문제점 발견

  • 로컬 혹은 테스트 환경에서 AWS S3에 이미지 파일을 업로드 기능을 테스트가 필요한 상황이였습니다.
    그런데 이 때마다 AWS S3 버킷에 이미지 파일이 업로드는 문제가 발생했습니다.
    => 테스트마다 AWS S3 버킷에 이미지 업로드 시 비용 발생 위험
    => 더미 이미지 파일이 업로드 되는 문제 발생해서 해당 파일을 삭제 할 때 번거로움 발생

 

 

이 문제를 개선하기 위해 찾아본 결과 S3를 Mock 해주는 방법을 발견하게 되었습니다.

  • 로컬에 인메모리 형태로 S3 Mock 서버를 띄우기
  • 파일을 업로드 할 때 영속성이 없는 휘발성 개념

 

 

 

😁 해결 과정

 

1. build.gradle 외부 의존성(dependencies) 추가

 

 

 

 

 

 

2. S3MockConfig.java

 

 

 

 

 

3. 실제 테스트 코드에서 S3MockConfig @Import 어노테이션 추가

  • 위와 같이 4번째 줄에 있는 @Import(S3MockConfig.class)를 추가해 주면 됩니다.
  • Mock이미지 파일을 업로드 하는 테스트 클래스에 추가를 해주시면, 실제 AWS S3에 이미지가 업로드가 안됩니다.

 

 

 

 

참고한 링크들

 

 

 

 

반응형

 

- 자바가 제공하는 다양한 연산자를 학습.

 

학습할 것

 

참고 자료

  • 블로그 [maru's 원자적 사고] => 링크
  • 블로그 [willy's blog] => 링크

* 공부를 하기 위해 작성한 글입니다. 더 자세한 내용은 위 링크들을 참고하시길 바랍니다.


 관계 연산자(Comparison Operators) 

  • 연관된 서로의 값들이 같은지 비교하거나, 넓게는 그 값보다 크거나 작음을 서로 비교하는 연산이다.
  • 두 가지 타입을 비교하게 된다면 결과 값은 true, false를 반환하게 된다.

 

 

 

연산자 기능
a < b a 가 b 보다 작은가?
a > b a 가 b 보다 큰가?
a <= b a 가 b 보다 작거나 같은가?
a >= b a 가 b 보다 크거나 같은가?
a == b a 와 b 가 같은가?
a != b a 와 b 가 다른가?

 

 

 '==' 연산자 (Equals Operators) 

  • 프리미티브 타입에 한해서 두 피연 사자의 값이 같으면 true, 아니면 false를 리턴한다.
    => 이는 프리미티브 타입에 한해서 'Value(값)'이 서로 같은지 비교를 한다.
    => 만약 프리미티브 타입이 아닌 '레퍼런스 타입'은 각 객체의 참조 주소를 비교하게 된다.
    결국 두 개의 값이 같은지 판단하는 게 아니라, 두 개의 주소가 같은지 판단하는 것이다.
    => 두 개의 String 변수가 있다면 '==' 연산자를 사용하면 주소가 같은지 비교하게 된다.

 

 

 '!=' 연산자 (Not Equals Operators) 

  • '!=' 연산자는 '==' 연산의 반개 개념이다.
  • 프리미티브 타입이 2개 있다면, 이 두 개의 값(Value)이 서로 다르다면 true를 반환하게 된다.
    => 반대로 같으면 false를 반환하게 됩니다.

 

 

 '<' 연산자 (Less than) 

  • 첫 번째 연산자가 두 번째 연산자보다 작으면 true를 반환한다.

 

 '<=' 연산자 (Less than equal) 

  • 첫 번째 연산자가 두 번째 연산자보다 작거나, 같으면 true를 반환한다.

 

 '>' 연산자 (Less than equal) 

  • 첫 번째 연산자가 두 번째 연산자보다 크다면, true를 반환한다.

 

 '>=' 연산자 (Less than equal) 

  • 첫 번째 연산자가 두 번째 연산자보다 같거나 크다면, true를 반환한다.

 

반응형

 

 

 

참고자료

  • 유튜브 채널 [백기선] => 링크
  • 토비의 스프링 3.1(저자 이일민) 

https://book.naver.com/bookdb/book_detail.nhn?bid=7006516 

 

토비의 스프링 3.1 세트

『토비의 스프링 3.1』은 스프링을 처음 접하거나 스프링을 경험했지만 스프링이 어렵게 느껴지는 개발자부터 스프링을 활용한 아키텍처를 설계하고 프레임워크를 개발하려고 하는 아키텍트에

book.naver.com


 

https://www.youtube.com/watch?v=97lYN9YW03Q 

 

위의 영상을 기반으로 작성 했습니다.

 

토비의 스프링을 공부 하다가 어떻게 해야 효율적으로 공부 할 수 있을까 고민하게 되었습니다.

이전까지는 단순히 해당 내용을 최대한 간추려서 전부 적을려고 했는데 많이 비효율적이라고 생각했습니다.

그래서 자주 보는 백기선님의 유튜브 채널에 잘 나와 있어서 보고 정리해봤습니다.

 

 

 스프링 학습 로드맵은 없다. 

  • 시중에 나와있는 책들이 로드맵을 제공 한다고 할 수 있다.
    => 하지만 저자가 중요하다고 생각하는 것을 정리해서 나온것(저자가 추측)
    => 모든 사람에게 그 로드맵이 정답이라고 할 수없음
  • 학습 로드맵은 자기 자신에게 달려있다.
    => 자기 자신이 원하는게 무엇인지?
    => 자신이 얼마나 스프링을 알고 싶은지가 중요하고 각 단계마다 공부법이 다르다.
    (대충 알아도 되는 단계, 좀 더 궁금한 단계, 깊게 알고 싶은 단계, 다 알고싶다 등..)
  • 너무 깊게 공부하는 단계는 가성비가 안나온다.
    => 내가 학습하는 비용에 비해서 개발에 얼마나 도움이 되는지?
    => 깊게 공부하면 언젠가는 도움이 되지만, 실제 만들 때 가성비가 좋지 않음

 

 

 

 대충 알아도 되는 단계 

  • 스프링의 "스"자도 몰랐을 때
  • 스프링의 코드를 보고 익히는게 좋다.
    => DI의 개념을 먼저 공부하는게 아니라 코드를 보고 "객체를 이렇게 받아올 수 있구나" 정도
    => AOP는 예제코드를 타이핑 해보는 정도까지만 하고 끝내기
  • 스프링이 무엇을 해주는지 감을 잡는 단계
  • 이정도 공부 하는데 어렵지는 않다.
    => 하지만 코딩을 직접 해보지 않기 때문에 1 ~ 2달이면 까먹을 수 있다.
    => 직접 타이핑 해야 훨씬 기억에 많이 남는다.

 

 

 좀 더 궁금한 단계 

  • 스프링을 직접 사용해서 개발을 해야 하는 단계
  • 볼려는 레퍼런스가 너무 방대하다 싶으면 그것을 전부 다 보는 것은 가성비가 안나온다.
    => 토비의 스프링을 전부 정독하는 것
  • 핵심을 파악할 것
    => IoC 컨테이너, AOP, 추상화 계층(MVC, JDBC, Resource, O/X M, O/J M 등등)
    => 예제 코드 하나씩은 직접 짜볼 것
    => 이거 이해하고 짜보는데 그 두꺼운 책이나 레퍼런스를 다 읽을 필요가 없다.
  • 취업이 목표라면 이정도 단계여도 하는데 문제는 없다.
  • 토비의 스프링을 전부 보는게 아니라 필요한 부분만 보는 것
    => Controller의 계층구조는 상속구조로 만드는 내용 같은건 스킵 하는게 좋다.
  • 이정도까지 공부하면 누구한테도 설명이 가능한 정도

 

 

 스프링에 사랑에 빠진 단계 

  • 전부 다 공부하는 것은 가성비가 안나온다.
  • 이렇게 공부하는건 언젠가는 도움은 되지만, 그 시간에 다른 것을 공부 할 수 있다.
  • 회사에 입사하고 업무에서 사용을 스프링을 안쓸수도 있다.
    => 스프링을 깊게 공부 했는데 이직을 해서 사용을 안한 경우도 있음.
    => 이 단계에서는 취미로 스프링 공부를 꾸준히 할 수도 있음.
  • 스프링 부트는 그나마 짧아서 괜찮지만 스프링은 너무 방대하다.
반응형

 

참고자료

  • 블로그[sohyun] - [JAVA] Converting MultipartFile to File => 링크
  • 블로그[진짜 개발자] - SpringMVC - Spring MVC 동작원리 => 링크
  • 블로그[코딩수첩] - Multipart란? => 링크
  • 블로그[dk22.log] - Spring MVC (15) 파일 업로드1 => 링크
  • 자바의정석(저자 남궁성)

 

 Multipart란? 

  • 웹 클라이언트가 요청을 보낼 때, HTTP 프로토콜바디 부분에 데이터를 여러 부분으로 나눠서 보내는 것입니다.
  • 웹 클라이언트가 서버에게 파일을 업로드할 때, http 프로토콜의 바디 부분에 파일정보를 담아서 전송을 하는데,
    파일을 한번에 여러개 전송을 하면 body 부분에 파일이 여러개의 부분으로 연결되어 전송됩니다.
    이렇게 여러 부분으로 나뉘어서 전송되는 것은 Multipart data라고 합니다.
  • 보통 파일을 전송할 때 사용합니다.

 

 

 Multipart/form-data란? 

  • 일반적으로 폼 데이터를 전송하면 application/x-www-form-urlencoded 의 형식으로 전송됩니다.
    => HTTP body 에 바로 전송하고자 하는 데이터가 들어가는 형태입니다.
    => 예시로 name=lim&age=25 과 같은 key-value 쌍이 body에 들어가는 것입니다.
         이렇게 동일한 타입의 문자 데이터를 전송하는 것은 전혀 무리가 없습니다.
  • key-value 형태의 문자데이터와 바이너리 형태의 파일 데이터가 함께 전송되는 것은 다릅니다.
    => application/x-www-form-urlencoded 타입으로는 전송이 어렵습니다.
    => 여기서 multipart/form-data로 지정되고 정해진 형식에 따라 메시지를 인코딩해 전송합니다.
    => 이를 처리하기 위해 서버는 멀티파트 메시지에 대해서 각 파트별로 분리하여 개별 파일의 정보를 얻게 됩니다.
    * 이미지 파일도 문자로 이뤄져 있어 HTTP request body에 담아 서버로 전송합니다.

 

 

 MultipartResolver 

  • MultipartResolver의 경우 사용자의 파일업로드 요청에 대한 처리를 하는 인터페이스입니다.
  • MultipartResolver의 경우에는 개발자가 별도의 Bean을 등록하지 않는다고해도 별도로 Spring에서
    등록해 주지 않습니다. 하지만 Spring Boot를 사용한다면 기본 구현체가 등록이 됩니다.
  • springMVC에서는 파일 업로드 처리 시 DispatcherServlet에서 사용할 MultipartResolver의 Bean을 등록을 해주어야 합니다.

 

 

 MultipartFile 이란? 

사용자가 업로드한 File을 핸들러에서 손쉽게 다룰 수 있게 도와주는 매개변수 중 하나입니다.

매개변수를 사용하기 위해서는 MultipartResolver Bean이 등록되어 있어야 합니다.

이는 springBoot에서는 자동 등록을 지원하지만, springMVC에서 기본으로 등록해주지 않으므로 꼭 확인해야 합니다.

  • MultipartFile 인터페이스는 스프링에서 업로드 한 파일을 표현할 때 사용되는 인터페이스입니다.
  • MultipartFile 인터페이스를 이용해서 업로드한 파일의 이름, 실제 데이터, 파일 크기 등을 구할 수 있습니다.

 

 

 File 클래스란? 

  • 기본적이면서도 가장 많이 사용되는 입출력 대상이기 때문에 중요하다.
  • 자바에서는 File클래스를 통해서 파일과 디렉토리를 다룰 수 있도록 하고 있습니다.
    => 그래서 File인스턴스는 파일 일 수도 있고 디렉토리일 수도 있습니다.

 

 

 

 

반응형

 

 

- 자바가 제공하는 다양한 연산자를 학습.

 

학습할 것

 

참고 자료

 

Java의 정석:최신 Java 8.0 포함

COUPANG

www.coupang.com

 

 

 

 산술 연산자 

  • 산술 연산자에는 사칙 연산자( +, -, *, / )와 나머지 연산자( % )가 있다.
  • 사칙연산은 일상생활에서 자주 사용하는 익숙한 것이라 그리 어렵지 않을 것이다.

 

 

 사칙 연산자 

  • 덧셈,( + ), 뺄셈( - ), 곱셈( * ), 나눗셈( / )은 아마도 프로그래밍에서 가장 많이 사용되는 연산자들 일 것이다.
  • 곱셈( * ), 나눗셈( / ), 나머지( % ), 연산자가 덧셈( + ), 뺄셈( - )연산자보다 우선순위가 높으므로 먼저 처리된다.
  • 피연산자가 정수형인 경우, 나누는 수로 0을 사용할 수 없다.
    => 만일 0으로 나눈다면 실행 시 에러가 발생할 것이다.

 

 

결과

  • 나누기 연산자는 두 피연산자가 모두 int타입인 경우, 연산결과 역시 int 타입니다.
    => 실제 연산결과는 2.5일지라도 int타입의 값인 2를 결과로 얻는다.
  • int타입은 소수점을 저장하지 못하므로 정수만 남고 소수점 이하는 버려지기 때문이다.
    => 이 때 반올림이 발생하지 않는다는 것에 주의하자.

 

반응형

 

목표

- 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.

 

학습할 것

 

참고 자료

 

* 공부의 목적으로 위 블로그를 참고해서 정리했습니다.

 

 

 타입 추론이란? 

  • 변수의 타입을 명시적으로 적어주지 않아도, 컴파일러가 알아서 이 변수의 타입을 대입된 리터럴로 추론하는 것
  • 대표적인 타입 추론 언어는 자바스크립트, 코틀린, 스위프트 등이 있다.
  • 컴파일 시점에, 컴파일러가 오른쪽에 있는 초기화 값 리터럴로 타입을 추론한다.

 

instanceof(객체 타입을 확인하는 연산자)를 통해 str2의 변수 타입이 String인지 체크해봤습니다.

 

 

컴파일 시점에, 컴파일러가 오른쪽에 있는 초기화 값 리터럴로 타입을 추론합니다.

그래서 str2의 타입이 String으로 선언되어 "str2 변수의 타입은 String입니다" 출력되었습니다.

 

 

 

 

 Var는 키워드(KeyWord)가 아니다 

  • var는 키워드가 아니다.
    => 어떠한 타입도 아니고, 클래스에서 사용할 수 있는 예약어가 아니다.
    => 그래서 우리가 int를 변수 이름으로 만들 수는 없지만, var라는 문자를 변수로 사용 가능하다.

위 사진과 같이 해도 에러가 발생하지 않는다.

 

 

 

 Var는 런타임 오버헤드가 없다. 

  • 자바스크립트와 같은 언어들은 let으로 선언되 변수를 중간에 다른 값으로 변경할 수 있다.
    ex) let number = 10; => number = "Hello!!";
  • 하지만 자바에서는 컴파일단에서 에러가 발생한다.

 

 

 

 Var의 잘못된 사용법 

 

1. Var는 초기화없이 사용할 수 없다.

 

 

2. Var 타입 변수에는 null 값이 들어갈 수 없다.

 

 

3. Var 타입은 로컬 변수에만 선언이 가능하다.

 

 

 

반응형

+ Recent posts