신변잡기 분석 및 설계

블로그 이미지

큐그

IT 관련 및 신변잡기에 대한 포스팅을 해보고자 하는 블로그입니다.

'java'에 해당되는 글 4건

제목 날짜
  • [아이템 27] 비검사 경고를 제거하라 2022.05.28
  • [아이템 15] 클래스와 멤버의 접근 권한을 최소화하라 2022.05.13
  • [데이터베이스] log4jdbc 로그 출력하기 - resultsettable이 정상적으로 로그에 나오지 않을 때 2022.03.04
  • 리눅스 자바 설치 및 오류 정리(Linux Java installation and error correction), java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory 2017.10.18

[아이템 27] 비검사 경고를 제거하라

IT 개발/개념 정리 2022. 5. 28. 15:20

제네릭을 사용하면 컴파일러 경고를 많이 마주치게 되는데 할 수 있는 한 모든 비검사 경고를 제거해야한다. 

  • 모두 제거하면 해당 코드는 타입 안전성을 보장할 수 있다. ClassCastException이 발생할 일이 없다.
  • @SuppressWarnings("unchecked")은 경고는 제거할 수 없으나 타입 안전성을 확보했을 때 해당 애너테이션을 달아 경고를 숨길 수 있다.
  • @ SuppressWarnings 애너테이션은 항상 가능한 한 좁은 범위에 적용
  • @SuppressWarnings("unchecked") 애너테이션을 사용할 때면 그 경고를 무시해도 안전한 이유를 항상 주석으로 남겨야 한다.
반응형
저작자표시 비영리 변경금지 (새창열림)

'IT 개발 > 개념 정리' 카테고리의 다른 글

[아이템 29] 이왕이면 제네릭 타입으로 만들라  (0) 2022.06.03
[아이템 28] 배열보다는 리스트를 사용하라  (0) 2022.05.29
[아이템 26] raw type은 사용하지 말라  (0) 2022.05.27
[아이템 25] 톱레벨 클래스는 한 파일에 하나만 담으라  (0) 2022.05.27
[아이템 23] 태그 달린 클래스보다는 클래스 계층구조를 활용하라  (0) 2022.05.27
Posted by UIJ

[아이템 15] 클래스와 멤버의 접근 권한을 최소화하라

IT 개발/개념 정리 2022. 5. 13. 23:38

잘 설계된 컴퓨넌트는 내부 구현 정보를 캡슐화하여 숨기고 외부 컴포넌트는 API를 통해 외부와 정보를 주고 받을 수 있도록 분리되어 설계된다. 정보 은닉이 잘된 시스템은 아래와 같은 장점이 있다. 

 

  • 컴포넌트별 캡슐화가 잘 되어 있어 병렬 개발할 수 있으며 이는 시스템 개발 속도를 높인다. 
  • 시스템 관리 비용을 낮춘다. 캡슐화로 인해 오류 발생 시 컴포넌트별로 빠르게 파악할 수 있고 디버깅 시 연관도가 낮아 수정 개발이 편리하다.
  • 성능 최적화를 할 수 있다. 완성된 시스템을 프로파일링해 최적화할 컴포넌트를 정해 해당 컴포넌트만 수정 & 변경을 통해 최적화할 수 있다.
  • 소프트웨어 재사용성을 높일 수 있다.
  • 큰 시스템을 제작하는 난이도를 낮춰준다. 

접근 제한자(private, protected, public)와 선언된 위치로 접근성이 제한된다. 접근 제한자를 활용하여 정보 은닉의 이점을 누릴 수 있다. 모든 클래스와 멤버의 접근성을 좁히면 된다. 

 

 

클래스, 인터페이스의 접근 제한자

package-private public
패키지 외부에서 쓸 이유가 없다 공개 API가 되어 서비스를 종료할 때까지 계속 버전 관리 필요
다음 릴리즈에서 수정, 교체, 제거 가능  

* 외부 공개 API를 제공하는 목적이 아니면 public으로 선언하는 것은 고려해야한다.

 

 

 

 

접근 제어자(Access Modifier)

  • private : 멤버를 선언한 클래스에서만 접근할 수 있다.
  • package-private(default) : 멤버가 소속된 패키지 안의 모든 클래스에서 접근할 수 있다. 
  • protected: package-private의 접근 범위를 포함하고 해당 멤버를 상속한 하위 클래스에서도 접근할 수 있다.
  • public : 모든 곳에서 접근할 수 있어 공개 API이다.

해당 클래스, 클래스가 속한 패키지내의 구현 범위에 해당하는 private과 package-private는 공개 API에 영향을 주지 않는다. * Serializable을 구현한 클래스에서는 의도와 달리 공개 API가 될 여지가 있다.

 

테스트를 위해서 멤버 접근 범위를 넓히려 하는데 private -> package-private까지는 괜찮지만 그 이상은 적용하지 않는게 좋다. 테스트를 위함이라면 테스트 코드를 같은 패키지에 두면 package-private 요소에 접근할 수 있기에 package-private은 가능하다.

 

public 클래스의 인스턴스 필드는 public을 지양하는 게 좋다. 

  • 가변 객체를 참조하거나 final이 아닌 경우 필드의 값을 제한할 수 없다. 
  • 따로 스레드 처리를 하지 않을 경우 public 인스턴스 필드는 락 획득을 할 수 없어 어느 곳에서나 접근하여 값을 변경할 수 있는 thread safe하지 않다.

예외도 존재하는데 클래스의 추상 개념을 표현하는데 꼭 필요한 구성요소로의 상수라면 public static final필드로 공개해도 좋다. * public static final String DATE_FORMAT 대문자 알파벳으로 작성하며 단어 사이에 밑줄(_)을 작성한다. 이런 타입은 불변 객체나 기본 타입 값을 참조해야한다. 

  • 가변 객체를 참조할 경우 setter를 통해 final이 아닌 필드의 값은 변경될 수 있다. 이럴 경우 의도하지 않게 값을 변경할 수 있는 가능성을 열어두게 된다. *final로 인스턴스를 생성했을 때의 동작방식에 대해 살펴보면 알 수 있다.

클래스에서 public static final 배열 필드를 두거나 이 필드를 반환하는 접근자 메서드를 제공해서는 안 된다. * 길이가 0이 아닌 배열은 모두 변경 가능하기 때문이다.

  • 배열을 private으로 만들고 clone()으로 복사본을 반환하는 public static final 메서드를 제공하는 방법
  • 동일하게 배열을 private으로 만들고 public 불변 리스트를 추가

 

자바 버전 9부터는 모듈 시스템(패키지들의 묶음이며 같은 모듈 안에 패키지들은 자유롭게 공유할 수 있다.)이라는 개념이 도입되면서 public 클래스의 public, protected 멤버에 한하여 같은 모듈 내부에서만 접근 가능하도록 한정했다. 이 같은 개념을 가장 잘 활용하는 사례가 JDK인데 자바라이브러리에서 공개하지 않는 패키지들은 해당 모듈 밖에서는 절대로 접근할 수 없다. 

 

 

 

뒷 장에서 확인해야할 내용

한 클래스에서만 사용하는 package-private 톱레벨 클래스나 인터페이스는 이를 사용하는 클래스 안에 private static으로 중첩시켜보자

단 Serializable을 구현한 클래스에서는 그 필드들도 의도치 않게 공개 API가 될 수 있다.(아이템 86,87)

반응형
저작자표시 비영리 변경금지 (새창열림)

'IT 개발 > 개념 정리' 카테고리의 다른 글

[아이템 17] 변경 가능성을 최소화하라  (0) 2022.05.14
[아이템 16] public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라  (0) 2022.05.14
[이펙티브 자바 3장] 모든 객체의 공통 메서드  (0) 2022.05.02
[ssh known_hosts]  (0) 2022.03.16
[네트워크] telnet, netstat -tnlp 명령어  (0) 2022.03.04
Posted by UIJ

[데이터베이스] log4jdbc 로그 출력하기 - resultsettable이 정상적으로 로그에 나오지 않을 때

IT 개발/에러 2022. 3. 4. 23:09

log4jdbc 로그 출력

 

배경 :

case 1. 동일한 환경인데 특정 서버에서 resultsettable = "INFO"로 설정했음에도 로그 파일에 쿼리 실행 결과인 조회된 데이터가 table 형태로 로그에 남지 않음.

 

원인 : datasource의 driver class name이 문제

 

jdbc-url이 jdbc:log4jdbc:mysql://localhost:3306/~ 였는데 driver class name은 org.mariadb.jdbc.Driver 였기에 log4jdbc를 활요하지 못 한 log4jdbc를 사용하려면 jdbc-url에도 log4jdbc가 포함되어야하고 driver class는 net.sf.log4jdbc.sql.jdbcapi.DriverSpy로 설정되어야 한다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'IT 개발 > 에러' 카테고리의 다른 글

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String  (0) 2022.03.17
[데이터베이스] Error querying database. Cause: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.  (0) 2022.03.08
맥 인텔리제이 마우스 클릭 에러 Mac IntelliJ mouse click error  (3) 2022.02.09
[VirtualBox]가상 머신 OO의 세션을 열 수 없습니다, Failed to open a session for the virtual machine, E_FAIL (0x80004005)  (0) 2017.11.20
[Oracle] ORA-00904 : 부적합한 식별자 invalid identifier  (1) 2017.11.06
Posted by UIJ

리눅스 자바 설치 및 오류 정리(Linux Java installation and error correction), java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

IT 개발/에러 2017. 10. 18. 18:12


AWS 리눅스에 자바를 깔면서 이번에 삽질을 좀 하게 되었고, 그것을 정리하여 남겨보려고 합니다.


시간이 지난 뒤에 작성하여 다소 두서없는 내용일 수 있으니 참고하시기 바랍니다.


1. 에러 메시지: java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory



2. 상황: openJDK가 깔려 있는 리눅스에 Oracle JDK를 설치하고 java 관련 명령어를 사용했을 때.


3. 해결방법

  • 여러가지 방법을 시도했는데 어떤 것이 해결한 방법인지 확실하지 않습니다.

  • 3.1. vi /etc/ld.so.conf.d/java.conf 를 통해 아래와 같이 내용 추가 (이 경로는 저의 경우입니다)

     /usr/java/jdk1.8.0_121/lib

     /usr/java/jdk1.8.0_121/lib/amd/jli


    추가 후 ldconfig 명령어 사용은 필수입니다.

    확실하게 확인하시려면 find / -name libjli.so를 통해 libjli.so의 위치를 확인하시기 바랍니다.


  • 3.2. java, javac를 기본 명령어로 등록한다.(root 권한 필요)

 update-alternatives --install "/usr/bin/java" "java" "/usr/bin/jdk1.8.0_121/bin/java" 1;

 update-alternatives --install "/usr/bin/javac" "javac" "/usr/bin/jdk1.8.0_121/bin/javac" 1;

 update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/bin/jdk1.8.0_121/bin/javaws" 1;



 update-alternatives --set java /usr/bin/jdk1.8.0_121/bin/java;

 update-alternatives --set javac /usr/bin/jdk1.8.0_121/bin/javac;

 update-alternatives --set javaws /usr/bin/jdk1.8.0_121/bin/javaws;


이 명령어를 사용하여 java, javac, javaws 를 기본 명령어로 등록하고, 아래의 명령어를 통해 어떤 버전의 자바를 사용할 것인지 선택합니다. 물론 경로 수정은 필수입니다.


 update-alternatives --config java




저는 이 방법을 통해 해결되었고, 제대로 정리는 안되었지만 해결책을 찾으시는 분들께 조금이나마 도움이 되길 바랍니다.



아래는 혹시 모를 영문 사용자를 위한 구글 번역기를 통한 영문 번역(번역이 맞는 지는 알 수가 없다).





I've been working on Java on AWS Linux this time, and I want to keep it organized.


Please note that it may be a bit confusing to write after a time.


1. Error message: java: error while loading shared libraries: libjli.so: can not open shared object file: No such file or directory



2. Situation: When installing Oracle JDK on Linux with openJDK and using java related commands.


3. Solution: I tried several methods, but I'm not sure what worked.


  • 3.1. vi Add the following contents via /etc/ld.so.conf.d/java.conf (this path is my case)

     /usr/java/jdk1.8.0_121/lib

     /usr/java/jdk1.8.0_121/lib/amd/jli


Use of the ldconfig command after adding is required.

To be sure, check the location of libjli.so via find / -name libjli.so.


  • 3.2. Register java, javac as basic commands (root privilege required)

 

 update-alternatives --install "/usr/bin/java" "java" "/usr/bin/jdk1.8.0_121/bin/java" 1;

 update-alternatives --install "/usr/bin/javac" "javac" "/usr/bin/jdk1.8.0_121/bin/javac" 1;

 update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/bin/jdk1.8.0_121/bin/javaws" 1;



 update-alternatives --set java /usr/bin/jdk1.8.0_121/bin/java;

 update-alternatives --set javac /usr/bin/jdk1.8.0_121/bin/javac;

 update-alternatives --set javaws /usr/bin/jdk1.8.0_121/bin/javaws;


Use this command to register java, javac, javaws as basic commands, and use the following command to select which version of Java to use. Of course, route modification is a must.


 

 update-alternatives --config java



I have been solved through this method, and although it has not been properly organized, I hope to help those who are looking for a solution.



반응형
저작자표시 비영리 변경금지 (새창열림)

'IT 개발 > 에러' 카테고리의 다른 글

[데이터베이스] log4jdbc 로그 출력하기 - resultsettable이 정상적으로 로그에 나오지 않을 때  (0) 2022.03.04
맥 인텔리제이 마우스 클릭 에러 Mac IntelliJ mouse click error  (3) 2022.02.09
[VirtualBox]가상 머신 OO의 세션을 열 수 없습니다, Failed to open a session for the virtual machine, E_FAIL (0x80004005)  (0) 2017.11.20
[Oracle] ORA-00904 : 부적합한 식별자 invalid identifier  (1) 2017.11.06
[Oracle]ORA-00918: 열의 정의가 애매합니다 column ambiguously defined  (0) 2017.10.24
Posted by 큐그
이전페이지 다음페이지
블로그 이미지

IT 관련 및 신변잡기에 대한 포스팅을 해보고자 하는 블로그입니다.

by 큐그

공지사항

    최근...

  • 포스트
  • 댓글
  • 트랙백
  • 더 보기

태그

  • effective java
  • MvcRequestMatcher
  • IntelliJ
  • 상속
  • java
  • 자바
  • 제네릭
  • bytearrays -> string
  • require_new
  • Effective JAVA 3/E
  • Spring Batch
  • 에러
  • 인터페이스
  • Target클래스
  • 맛집리뷰
  • 이펙티브 자바 3/E
  • 네트워크
  • ArithmeticException
  • 클래스와 인터페이스
  • group_concat querydsl
  • 오류
  • 오마카세
  • ClassCastException
  • 맛집
  • 매개변수
  • 이펙티브 자바
  • bytearrays
  • 리뷰
  • 데이터베이스
  • CGLIB Proxy

글 보관함

«   2025/06   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

링크

카테고리

분류 전체보기 (65)
IT 개발 (58)
개념 정리 (30)
명령어 (2)
에러 (17)
코딩테스트 (2)
초대장 (1)
구매 (2)
맛집 (3)
식당 (2)
카페 (1)

카운터

Total
Today
Yesterday
방명록 : 관리자 : 글쓰기
큐그's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라
favicon

신변잡기 분석 및 설계

IT 관련 및 신변잡기에 대한 포스팅을 해보고자 하는 블로그입니다.

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • 분류 전체보기 (65)
    • IT 개발 (58)
      • 개념 정리 (30)
      • 명령어 (2)
      • 에러 (17)
      • 코딩테스트 (2)
    • 초대장 (1)
    • 구매 (2)
    • 맛집 (3)
      • 식당 (2)
      • 카페 (1)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바