[Java] 연산자 우선순위

Java 2022. 12. 18. 17:23

- @참고: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=dnzh&logNo=100134269443

 

- 우선순위가 높은 순서부터 낮은 순서대로 

연산기호 결합방향 우선순위
 expr++, expr--    
++expr, --expr, 부호연산자, !, ~    
*, /, %    
+, -    
shift 연산자    
부등호, instanceof    
비교(==, !=)    
순서대로 우선순위 &, ^, |    
순서대로 우선순위 &&, ||    
삼항연산자    
대입(=, +=, -=, *=, /=, %=, &=, ^= , |=, <<=, >>=, >>>=)    

 

* 후위 증감 연산자 (expr++, expr--) 

';' 를 만나거나 같은 변수를 만날 경우 변경된 값이 저장된다.

 

'Java' 카테고리의 다른 글

[Java] Heap 모니터링 & Heap Dump 분석하기  (1) 2023.05.10
[Java] LocalDateTime, Timestamp 변환  (0) 2021.02.26
[Java] Set to List, List to Set  (0) 2021.02.25
[Java] Optional 사용법  (0) 2021.02.19
[Java] 파일 입출력  (0) 2021.01.27
블로그 이미지

uchacha

개발자 일지

,

- 펌(소프트웨어 개발 수명주기(SDLC)): https://www.servicenow.com/kr/products/devops/what-is-sdlc.html

 

SDLC의 이점

모든 사람이 동의하고 이해할 수 있는 중앙 집중식 사전 목표를 제공함으로써, 리소스 및 관련 비용을 비롯하여 명확한 개발 계획을 세우고, 계발을 올바르게 수행할 수 있도록 역할을 할당할 수 있음

 

소프트웨어 개발 수명주기(SDLC)

1. 현재 문제 식별

2. 계획 수립

who: 프로젝트 리더

what:

- 프로젝트에서 다룰 범위 명확하게 정의

-> 프로젝트가 범위를 넘어서 확장되거나 바뀌지 않도록 프로젝트의 경계를 설정

- 인건비, 재료비 계산

- 프로젝트 조건을 평가하여 목표가 설정된 일정표 구성

- 계획에 이해 관계자, 애플리케이션으로 혜택을 얻는 사람의 피드백 사안도 포함

3. 요구 사항 정의

- 요구사항을 정의 및 문서화 하고 이해 관계자에게 승인을 얻음

* 요구사항: 애플리케이션 목적, 포함할 기능, 해당 과정에서 나타날 수 있는 장애물을 규정

* 필요조건: 리소스를 식별하고 프로젝트에 구축

4. 디자인 및 프로토타이핑

- 애플리케이션이 작동하는 방식, 디자인 요소를 모델링하는 설계 단계

  - UI: 고객이 소프트웨어와 상호작용하는 방식과 소프트웨어가 특정 입력에 응답하는 방식

  - 프로그래밍

  - 보안: 애플리케이션의 보안을 보장하기 위해 실행할 특정 조치. SSL 암호화, 암호 보호 및 안전한 데이터 저장 등

  - 통신: 애플리케이션이 중앙 서버와 같은 다른 자산과 통신하는 방법

  - 아키텍처: 업계 관행, 모든 템플릿, 전체 디자인 및 특정 프로그래밍 언어

  - 플랫폼: 소프트웨어를 호스팅할 플랫폼

- 설계 후 애플리케이션의 인터페이스, 응답 방법, 실행 기능에 대한 기본 아이디어를 보여주기 위한 프로토타입 구축

-> 애플리케이션을 승인하기 위해 이해 관계자로부터 피드백을 받음

5. 소프트웨어 개발

- SDLC 단계

-> 테스트 결과를 기다리거나 코드를 컴파일하는 것과 같이 생산을 지연할 수 있는 소프트웨어 개발 프로세스 문제를 예측, 해결

6. 테스트

- 애플리케이션 부문마다 다른 부문과 문제없이 상호작용하면서 각 기능이 실행되는지 확인

-> 사용자가 애플리케이션을 사용할 때 발생할 수 있는 버그를 줄이고, 사용율을 높이고, 사용자 만족도를 개선

7. 배포

8. 운영 및 유지관리

- 테스트 중에 발생하지 않는 버그를 발견하고 해결

-> 자체 반복 프로세스로 시작할 수도 있음

 

SDLC 방법론

1. Waterfall

- 선형모델, 이전 단계가 완전히 끝날 때까지 다음 단계를 시작할 수 없음.

- 기업이 프로세스 각 단계에 대한 연속성과 실행 가능성을 분석하는데 도움이 되어 병목 현상이나 사일로(부서 이기주의)를 제거하는데 유용

2. Agile

- 사용자 입력과 경험을 핵심적으로 강조

- 피드백에 매우 민감하게 반응하며, 급변하는 시장에 적응하기 위해 더 빠른 주기로 소프트웨어가 출시되도록 운용

3. 반복

- 소프트웨어 초기 버전을 신속하게 구축 후 간단한 반복 과정을 거쳐 개선

- 애플리케이션을 시작하고 실행할 수 있는 대규모 애플리케이션에서 일반적으로 사용되는 접근 방식

-> 비즈니스 요구를 보다 빠르게 충족함

4. DevOps

- Agile과 유사함. 설계 및 구현 단계에서 소프트웨어 사용자로부터 피드백을 수집하여 개발된 애플리케이션의 사용성과 관련성을 개선

- 구성원 팀원 간의 적극적인 공동 작업 및 커뮤니케이션을 활용하여 제품에 관한 모든 측면을 다룸. 개발, 테스트, 보안, 정보 기술 운영 역할을 맡는 담당자가 참여.

5. Spiral

- Waterfall에서와 같이 순차 프로세스로 다른 모델의 반복 접근 방식을 사용

-> 개발 과정에서 프로세스의 각 단계를 반복적으로 거치면서 Spiral 단계마다 점진적으로 출시하고 개선

 

소프트웨어 개발의 Best Practice

1. 소스 통제

- 작업 코드를 보호하기 위해 모든 코드를 단일 위치에 보관.

2. 지속적 통합

- 자산에 속한 각 구성요소가 수명주기 동안 일관성 있게 호환되어야 함

-> 모든 팀원이 유사한 프로그래밍 언어 및 라이브러리를 사용하여 충돌과 중복을 방지

3. SDLC 관리 시스템으로 프로세스 투명성 확보

- SDLC 관리 시스템은 분석, 작업 관리 시스템, 버그 추적으로 각 단계를 제어하고, 효과적으로 실행되지 않는 수명주기 영역을 개선할 수 있음.

 

 

 

 

 

 

 

블로그 이미지

uchacha

개발자 일지

,

- @참고: https://vmpo.tistory.com/106

 

양수에서 가장 큰 수가, 음수에서 가장 작은 수다!!!

11111111111111111111111111111111 = -1
11111111111111111111111111111110 = -2
11111111111111111111111111111101 = -3
11111111111111111111111111111100 = -4
11111111111111111111111111111011 = -5
11111111111111111111111111111010 = -6
11111111111111111111111111111001 = -7
11111111111111111111111111111000 = -8

 

//음수는 not 연산에 1을 더한 값이다.
-1*n == ~n + 1
블로그 이미지

uchacha

개발자 일지

,

환경

docker, spring boot, mysql 로 구동되는 application 에서 

어제만 해도 잘 동작하던 application 이 코드 수정 후 업데이트를 하자 아래와 같은 에러를 냈다.

- 에러 내역

더보기
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
	at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
	at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)
	at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
	at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
	at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198)
	at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
	at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358)
	at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206)
	at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477)
	at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560)
	at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
	at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
	at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
	at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:38)
	at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:108)
	... 50 common frames omitted
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
	at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)
	at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89)
	at com.mysql.cj.NativeSession.connect(NativeSession.java:144)
	at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:956)
	at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826)
	... 63 common frames omitted
Caused by: java.net.NoRouteToHostException: Host is unreachable
	at java.base/sun.nio.ch.Net.pollConnect(Native Method)
	at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:579)
	at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:549)
	at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597)
	at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:339)
	at java.base/java.net.Socket.connect(Socket.java:585)
	at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)
	at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63)
	... 66 common frames omitted

찾아보니 네트워크 router 관련 문제라고 하였다.

 

확인

해당 서버에서 db 서버로 접속이 잘 되는지 command 접속하여 확인해봤더니 접속이 잘 되었다.

application 을 docker 없이 따로 구동시켰더니 잘 되었다.

따라서 docker 문제임을 알 수 있었는데, 따로 변경해주었던 사항은 없었어서

 

해결

image 를 삭제했다가 새로 말아서 하니 network를 잘 잡았는지 잘 되었다.

 

* 기타로 효과를 못봤던 작업은

docker 껐다 켜기 효과 없음

컴퓨터를 껐다 켜기 효과 없음

블로그 이미지

uchacha

개발자 일지

,

- @참고: https://blog.naver.com/alice_k106/221310477844

[root@docker-node01 ~] docker ps -a --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}'
 
NAMES               IMAGE               STATUS
C0                  ubuntu:14.04        Exited (0) 22 hours ago
cs

 

  1. exit code 0: 성공적으로 종료됨
  2. exit code 125: 도커 명령어 자체가 실패한 경우
  3. exit code 126: 컨테이너의 커맨드가 실패한 경우 
  4. exit code 127: 컨테이너의 커맨드가 존재하지 않는 경우
  5. exit code 128 + n: 리눅스 시그널 n에 해당하는 오류가 발생한 경우 
    1. exit code 130: (128+2) Control + C로 종료된 경우
    2. exit code 137 & 143: (128+9, 15) 컨테이너가 SIGKILL 및 SIGTERM 을 받은 경우
      • 참고로, 컨테이너의 메모리 자원 부족으로 인한 OOM 시 컨테이너의 강제 종료에도 SIGKILL이 사용되어 137로 출력된다.
    3. exit code 255: 종료 코드가 범위를 벗어나는 경우 
블로그 이미지

uchacha

개발자 일지

,

[Java] System.in.read()

Algorithm 2022. 11. 1. 01:55

- @참고: https://blog.naver.com/jihogrammer/222314445259

 

아래와 같은 형태로 입력되는 입력값을 빠르게 받기는 법

2
10 8 17
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5

 

- 코드

private static int read() throws Exception {

    int c, n = System.in.read() & 15;

    while ((c = System.in.read()) > 32)
        n = (n << 3) + (n << 1) + (c & 15);

    if (c == 13) System.in.read();

    return n;

}
[출처] [Java] System.in.read() - 3|작성자 jihogrammer

 

코드 주석

# n = System.in.read() & 15;

15 = 1111(2) 이고

n = System.in.read() 일 때, 한글자의 수를 읽으면 48 <= n <= 57

48 = 32 + 16 = 2^5 + 2^4 이므로 4, 5번째 자리를 제외한 하위비트만 읽어오면 48를 빼는것과 같아진다.

뺄셈을 연산하지 않고도 단순 비트 연산을 통해 읽을 수 있다.

Char	ASCII	Binary
'0' ==	48	== 11_0000
'1' == 	49  == 11_0001
'2' ==	50  == 11_0010
...
'9'	== 	57	== 11_1001

n & 15 연산을 수행하여 뒤 4자리 비트만 읽을 수 있다.

 

# n = (n << 3) + (n << 1) + (c & 15);

위 식은에서 (c & 15) 앞쪽은  n = n * 8 + n * 2 

= n * 10 이다.

왜 이렇게 표현했는가 하면,

* 연산은 생각보다 ALU에서 처리하는 양이 많다. (내부적으로 shift 연산과 add 연산을 반복적으로 수행하기 때문에)

최적화 되어있는 방식으로 표현하여 수행속도를 빨리하기 위함이다.

블로그 이미지

uchacha

개발자 일지

,

- @참고: https://greatkim91.tistory.com/197

 

위 글에서

 

1. Java9 의 장점

2. Java9 의 탄생 목적(기존의 문제점)

3. Java9 에서 가능해진 일

4. Java9에서 고려해야 할 점(넘어야할 산)

 

등에 대해서 잘 설명해두었다.

 

기존 Java 의 캡슐화 지원이 부족해서 Java9 가 생겼다고 하는데, 이는 

기존에 JAR 로 제공된 패키지에서 사용하는 class 만 노출하기가 안된다는 점이다. 왜냐하면 기존에는 대부분의 클래스가 public 이기 때문이다.

문제는 API 제공자가 기능 향상이나 리팩토링을 하기 위해 이러한 내부용 API 를 바꾸고 싶을 때 문제가 된다.

 

Java Jigsaw 프로젝트는 유연한 런타임 이미지를 만들 수 있도록 Java 플랫폼을 모듈화한다. 이말은 Java 진형의 개발자가 jdk 자체도 자유롭게 업그레이드 할 수 있게 된다는 말이다.

작은 모듈 단위로 관리됨으로, 언어 레벨에서 모듈간의 의존성을 알 수 있으며, 애플리케이션이 사용하는 모듈만 모아 런타임환경(이미지)를 만들 수 있다.

언어레벨에서 모듈화를 지원하기 때문에 도구레벨에서 가능한 일로

java runtime 을 쪼갤 수 있다. 즉 배포시 사용하지 않는 Swing, XML, SQL 같은 패키지를 제외하고 배포할 수 있다.

 

- 런타임 이미지가 작아지는 것의 이점으로

1. 소형 디바이스에서 사용가능

2. 경량으로 도커 이미지, 클라우드 컴퓨팅, 마이크로 서비스에서 활용가능

3. 모듈화 시스템은 스타트업 시 필요한 모듈만 로드할 수 있어서 시간, 성능 향상

4. JDK, JRE 통합 가능

 

단 주의점으로 cyclic dependency(모듈간 상호 참조) 를 주의해야한다.

 

블로그 이미지

uchacha

개발자 일지

,

- @참고: https://ottl-seo.tistory.com/entry/IntelliJ-Cannot-resolve-symbol-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0

 

상황

springboot initializr 로 프로젝트 생성 후 open 하는데, run 이 안 떴다. 

can't resolve springframework 라는 문구와 함께 springframework 쪽에 빨간색으로 import가 제대로 안되었다.

환경은 window, java 1.8 path 로 잡혀있었고, 프로젝트 설정은 maven, java 1.8, springboot 2.7.4였다.

프로젝트 구성에 뭔가 문제가 있나 싶어서 eclipse 로 가져와봤는데 잘 동작하였다.

해결해보기 위해 cache 지훈 후 rebuild 하고 였나, 

invalid target release: 17

Module my-module SDK 17 is not compatible with the source version 17.

Upgrade Module SDK in project settings to 17 or higher. Open project settings.

위와 같은 문구가 뜨길래

project settings 에서 17을 다운받아 설정했더니, 

org.codehaus.plexus.component.repository.exception.ComponentLookupException: com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model.validation.DefaultModelValidator: method <init>()V not found
  at org.jetbrains.idea.maven.server.embedder.CustomModelValidator.<init>(Unknown Source)
  while locating org.jetbrains.idea.maven.server.embedder.CustomModelValidator
  at ClassRealm[maven.ext, parent: ClassRealm[plexus.core, parent: null]] (via modules: org.eclipse.sisu.wire.WireModule -> org.eclipse.sisu.plexus.PlexusBindingModule)
  while locating org.apache.maven.model.validation.ModelValidator annotated with @com.google.inject.name.Named(value=ide)

1 error
      role: org.apache.maven.model.validation.ModelValidator
  roleHint: ide

위와 같은 문구가 뜨면서 해결이 안된다.

 

아래 해결 방법 중 intellij 업데이트 및 rebuild 하니까 해결되었다.

 

해결 방법

1. 빌드 다시하기 

메뉴바 Build > Clean Project, Build > Rebuild Project

 

2. 캐시 비우고 재실행하기

메뉴바 File > Invalidate Caches / Restart

 

3. Gradle Refresh

메뉴바 Vew > Tool Windows > Gradle, 프로젝트명 우클릭 > Refresh Gradle Dependencies

 

4. Gradle 빌드 설정을 IntelliJ IDEA로 바꾸기

Preference창(Ctrl+Alt+S) > Build, Execution, Deployment > Build Tools > Gradle > Build and Run 등 설정을 IntelliJ IDEA로

 

5. IDE를 최신버전으로 업데이트하기

블로그 이미지

uchacha

개발자 일지

,