Home JAVA 기타 개념 정리글
Post
Cancel

JAVA 기타 개념 정리글

환경변수


환경변수란 운영체제가 컴퓨터를 동작시키는데 참조하는 변수를 의미한다.

그리고 PATH를 설정한다는 것은 운영체제가 컴퓨터 내 어떠한 디렉토리에 위치하고 있어도 특정 디렉토리 내 파일을 인식시키기 위해 해당 디렉토리를 가르키는 경로를 설정한다는 의미이다. 그래서 PATH로 설정된 경로(특정 디렉토리)에 저장된 파일은 cmd나 터미널가 어느 위치에 있더라도 실행시킬 수 있다.

그럼 자바에서 환경변수 설정이 왜 필요한건가?

Java 디렉토리에는 JDK와 JDE로 나눌 수 있다. JDK는 프로그램 개발 및 실행을 위한 파일들이 저장된 디렉토리라면 JDE는 오직 실행만을 위한 파일들이 저장된 디렉토리다.

그렇기 때문에 자바는 JDK를 환경변수로 설정해야 되고 그 중에서도 bin 디렉토리를 PATH로 설정해야 한다.

bin 디렉토리에는 자바의 컴파일러인 javac.exe 파일과 컴파일된 .class 파일을 실행시키는 java.exe 파일이 있는데, 위 두 실행파일을 통해 자바 파일을 실행시킬 수 있으므로 두 실행파일은 어떤 위치에서도 실행시킬 수 있어야 한다(실행시키고자 하는 클래스파일이 저장된 디렉토리에서 실행시켜야 하기 때문에). 그러므로 bin 디렉토리로 PATH를 설정하는 것이 일반적이다.

  • windows에서 PATH 설정 시에는 제어판에서 환경변수 설정을 손쉽게 설정할 수 있게끔 기능을 지원해주기 때문에 이를 활용하여 설정할 수 있다.

  • 다만 MacOS의 경우에는 터미널을 통해서 .bash_profile 이라는 파일에 환경변수를 추가해준다.

참고사이트


사용자변수와 시스템변수의 차이


  • 사용자 변수
    • 로그인된 계정 내에서 사용하는 변수
    • 사용자 계정별로 설정되어 있는 PATH가 다릅니다.
  • 시스템 변수
    • 컴퓨터 내에서 사용하는 변수
    • 한번 PATH를 설정해 두면 어떤 계정이든 사용 가능합니다.

      참고 사이트


java파일 실행시 파일명만 필요한 이유


JVM을 구동하기 위해 java filename 명령어를 실행하는데, 이는 “JVM이 filename에 해당하는 파일을 실행한다”가 아니라 “filename을 가진 바이트코드에 main메소드가 존재한다” 라는 사실을 전달하는 의미입니다.

그래서 확장자명을 포함하여 java.exe 파일을 실행시키면 확장자명까지 파일명으로 인식하여 main 메소드가 없다 또는 해당 파일명을 찾을 수 없습니다 라는 에러가 발생합니다.

참고 사이트


switch문에서 long이 제외된 이유


switch문에 비교대상변수로 지정 가능한 자료형은 long을 제외한 정수형과 몇몇 특별한 타입으로 제한한다.

굳이 long 타입만 제외한 이유가 궁금해서 구글링을 해본 결과 stackoverflow에 올라와 있는 몇몇 답변을 참고해봤다.

답변1 : 링크

Obviously, one can have a long that has only a few possible values, so that it is reasonable to use it as a switch expression, but that is unusual. Mainly, long is used when there are too many values for int, and so far too many values for a switch expression.

답변2 : 링크

A switch can essentially be implemented in two ways (or in principle, a combination): for a small number of cases, or ones whose values are widely dispersed, a switch essentially becomes the equivalent of a series of ifs on a temporary variable (the value being switched on must only be evaluated once). For a moderate number of cases that are more or less consecutive in value, a switch table is used (the TABLESWITCH instruction in Java), whereby the location to jump to is effectively looked up in a table.

Either of these methods could in principle use a long value rather than an integer. But I think it was probably just a practical decision to balance up the complexity of the instruction set and compiler with actual need: the cases where you really need to switch over a long are rare enough that it’s acceptable to have to re-write as a series of IF statements, or work round in some other way (if the long values in question are close together, you can in your Java code switch over the int result of subtracting the lowest value).

결론은 switch문은 비교대상변수를 분기하면서 나눠진 값의 범위에 따라 작성할 코드를 나누기 위해 사용되는 조건문인데, 그 변수로 long 타입의 큰 수를 지정할 경우가 거의 없고 비효율적이라는 판단이다.

long 타입으로 선언해야 하는 매우 큰 정수를 가지고 switch문을 만들어야 한다면 int타입으로 쪼개서 활용하는 것이 좋을 것이라는 의견이다.


DTO 추가 설명


DAO(Data Access Object)

  • DTO로 받은 데이터를 데이터베이스에 저장하거나 가져오는 역할을 수행하는 객체

DTO(Data Transfer Object)

  • 계층 간 데이터 교환을 하기 위해 사용하는 객체
  • 로직을 가지지 않는 순수한 데이터 객체(getter & setter)

VO(Value Object)

  • 값을 위해서만 사용되는 값 오브젝트
  • ReadOnly 특징을 가지고 있다.(getter만)

사용자로부터 받아온 데이터를 DTO를 통해 클래스화 한 다음 전송되면, DAO가 DTO에서 저장된 데이터를 가져와 DB에 저장하는 방식으로 작동됩니다.

참고 사이트 1(DTO, DAO)

참고 사이트 2(DTO, VO)


System.out.println() 추가 설명


System.out.println() 를 좀 더 자세히 분리해서 호출 과정을 살펴보았다.

  • System 클래스 : 표준 입력과 출력, 에러와 관련된 필드나 메소드가 선언된 클래스
  • out : 표준 출력과 관련된 메소드를 가진 PrintStream 타입의 객체이자 static 변수(클래스 변수)
  • println() : PrintStream 클래스에 선언된 메소드로 매개변수에 할당된 데이터값을 콘솔에 출력

클래스 변수를 호출할 때에는 클래스 변수를 선언한 클래스 타입의 객체를 통해서가 아니라, 클래스명을 그대로 가져와 호출한다.

  • System.out : System클래스의 클래스 변수인 out을 호출한다.

static으로 선언되지 않은 변수나 메소드는 객체를 통해 호출해온다.

  • System.out.println() : out 객체를 통해 해당 타입(PrintStream)에 선언된 public 메소드인 println()메소드를 호출한다.

참고사이트


This post is licensed under CC BY 4.0 by the author.