2022년 3월 21일 TIL

yshjft·2022년 3월 21일
0

데브코스 TIL

목록 보기
1/45
post-custom-banner

JAVA 이야기

1. JVM & JDK

JVM

  • 실행 환경(java)
  • byte 코드를 실행시키기 위한 가상 머신

JRE

  • 자바 실행 환경의 약자로 자바 프로그램을 실행하기 위한 도구들이 들어있으며 JVM이 이 안에 포함된다

JDK

  • JRE + 개발툴
  • 실행 + 개발(java + javac)

cammandline

javac Helloworld.java

  • javac는 컴파일 명령어
  • HelloWorld.class (byte code, 실행가능한 파일) 생성

java Helloworld

  • java는 실행 명령어

2. Build Tool

  • 자동으로 빌드해주고 실행해주는 도구

Build

소스코드 파일을 실행가능한 소프트웨어 산출물로 만드는 일련의 과정이며 컴파일은 빌드의 부분 집합이다.

  • 컴파일
    소스코드를 바이너리 코드로 변환하는 과정

gradle 프로젝트 set up

  1. gradle init
  2. select type of project → (2) application
  3. select implementation language → (3) Java
  4. multiple subprojects? → (1) only one application project
  5. select build script DSL
    • build script: 빌드를 어떻게 할 것인가?
    • 즉, 어떠한 script 언어를 사용할 것인지에 대한 질문
    • Groovy 선택
  6. select test framework
    • JUnit Jupiter == JUnit 5
    • JUnit 5 사용
  7. Project name 설정
  8. Source package 설정

gradle 구조

├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── temp
    │   │       └── App.java
    │   └── resources
    └── test
        ├── java
        │   └── temp
        │       └── AppTest.java
        └── resources
  • build.gradle: build script가 담겨 있다.
    • build script: 소스는 어디에 있으니 이를 어떻게 컴파일하고 실행을 어떻게 할지 기록되어 있다.
  • gradle: gralde 프로그램이 수행되는데 필요한 런타임이 있다.
  • setting.gradle: gradle 환경 설정 파일

command

  • gradle build: 빌드 수행
  • gradle run: 실행
  • gradle tasks: 모든 task 확인

task

  • build, run → gradle 명령 단위들(task)

  • build.gradle에 명시 되어 있다.

    // build.gradle
    tasks.named('test') {
      useJUnitPlatform()
    }
    
    // gradle test → useJUnitPlatform() 실행
  • build.gradle의 plugins에 java 프로그램을 빌드하고 실행할 수 있는 모든 테스크들이 존재한다.

3. IDE: 통합개발 환경

유용한 INTELLIJ 단축키

명령어설명
Option+Enter빠른 수정
Command + 1폴더창으로 커서 이동
Command + N새파일 생성
Shift + Shift파일 이름 검색
Option+Up/Down단계별 블럭 지정
Command+/주석 토글
Command+Option+L코드 리포맷팅
Ctrl+T리팩토링 메뉴
Shift+Command+A명령어 검색

4. 초보개발자가 알면 좋을 정보

Coding Convention

  • 클래스명은 대문자로 시작
  • 메소드나 변수명은 소문자로 시작
  • 들여쓰기는 Tab과 Space 둘 중 하나로만!

Reference

  • call by value

    int a = 100
  • call by reference

    Integer b = 100

Constant Pool

  • String에 += 연산자를 사용하지 말자!
    String a = "";
    // String이 10개가 생성된다. 새로운 String이 생성된다.
    for(int i = 0; i < 10; i++) {
      a += i;
      // "", "0", "01", "012", ..., "0123456789" → 10개
    }
  • StringBuffer를 사용하자.
StringBuffer & StringBuilder

StringBuffer와 StringBuilder는 가변성을 갖는다라는 공통점있다. 차이점은 StringBuffer의 경우 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다라는 점과 StringBuilder의 경우 동기화를 지원하지 않아 멀티쓰레드 환경에서 안전하지 않고 단일쓰레드에서 StringBuffer 보다 뛰어나다는 차이점이 있다.

Object

  • 모든 객체의 최상위 객체이다.
toString() & equals() & hashCode()
  • toString()

    • 기본 동작: 객체의 해시코드 출력
    • 클래스명@16진수해시코드
    • 오버라이딩을 통하여 객체의 정보를 문자열로 반환
  • equals()

    • 기본 동작: ‘==’ 연산(주소값 비교) 결과 반환
    • 오버라이딩을 통하여 주소가 아닌 내용 비교 결과를 반환
    • String.equals()
  • hashCode()

    • 기본 동작: 인스턴스가 저장된 가상머신의 주소를 10진수로 반환

    • 오버라이딩을 통해 두 개의 서로 다른 메모리에 위치한 객체가 동일성을 갖도록 한다

    • equals() & hashCode()
      equals()와 hashCode()를 함께 재정의 해야한다고 한다. Collection(HashSet, HashMap, HashTable)의 경우 hash 값을 사용하기에 equals()만 재정의한 경우 코드가 예상과 다르게 작동할 수 있다고 한다.

      // equals()만 재정의
      Set<Car> cars = new HashSet<>();
      cars.add(new Car("foo"));
      cars.add(new Car("foo"));
      
      System.out.println(cars.size()); // 2
      // equals() & hashCode() 재정의
      Set<Car> cars = new HashSet<>();
      cars.add(new Car("foo"));
      cars.add(new Car("foo"));
      
      System.out.println(cars.size()); // 1

      좀 더 자세한 내용..

Git

  • 빌드결과. 바이너리. 제너레이트 가능한 파일들. 로컬설정. 키/보안관련 파일들

    • 빌드결과, 바이너리
      .class, .jar, build/
    • 제너레이트 가능한 파일들
      gradle, gradlew, gradlew.bat (gradle을 실행하기 위한 파일들, gradle wrapper를 통해 생성할 수 있다.)
  • http://gitignore.io/
    자신이 사용하는 환경에 따라 .gitignore를 자동으로 생성할 수 있다.

  • .gitignore & gradle

    gradle-wrapper.jar 또는 grande-wrapper.properties오 같이 gradle wrapper 관련 파일들을 .gitignore에 포함해야하나?

    개인이 편한데로 할 것 (토론이 많이 일어나는 주제..)

profile
꾸준히 나아가자 🐢
post-custom-banner

0개의 댓글