본문 바로가기
알고리즘/알고리즘풀면서...

JAVA 팁(1)

by 두둠칫 2020. 10. 13.

0. 단축키

 

syso 입력한 후 Ctrl + Space : System.out.println(); 자동 완성

 

main 입력한 후 Ctrl + Space : main 문 자동 완성

 

try 입력한 후 Ctrl + Space : try-catch 문 자동 완성

 

for 입력한 후 Ctrl + Space : for 문 자동 완성

 

 

1. 입력 : 라인 단위로 읽어와서 잘라받는게 빠르다.

import java.io.BufferedReader;

import java.io.InputStreamReader;



BufferedReader br = new BufferedReader(new InputStreamReader(System.in));



/* 한 라인이 띄어쓰기 없이 여러 개의 입력 값일 때 */

String str = br.readLine();

int T = str.charAt(index);



/* 한 라인이 띄어쓰기로 구분된 여러 개의 입력 값일 때 */

String str = br.readLine();

StringTokenizer st = new StringTokenizer(str);

int T = Integer.parseInt(st.nextToken());



/* 한 라인이 하나의 입력 값일 때 */

int T = Integer.parseInt(br.readLine().trim());

 

2. Queue : Java의 Queue는 인터페이스이므로 객체 생성이 불가능하다. 따라서 LinkedList를 형변환하여 조작한다.

import java.utill.Queue;

import java.utill.LinkedList;



Queue<type> queue = new LinkedList<type>();

 

 

3. 정렬 할 때는 ArrayList에 담고 Collection.sort가 가장 빠르다.

* 내림차순 정렬

Collections.sort(list);

Collections.reverse(list);

 

* 정렬 기준 함수 오버라이딩

Collections.sort(wList, new Comparator<String>() {

     @Override
     
     public int compare(String o1, String o2) {

          if (o1.length() > o2.length())

               return 1;

          else if (o1.length() < o2.length())

               return -1;

          else 

               return o1.compareTo(o2);


	// return o2.compareTo(o1); // 내림차순
        // return o1.compareTo(o2); // 오름차순
      }

});



// 람다식 표현
Collections.sort(wList, (o1, o2)->{
          if (o1.length() > o2.length())
               return 1;
          else if (o1.length() < o2.length())
               return -1;
          else 
               return o1.compareTo(o2);
               
	// return o2.compareTo(o1); // 내림차순
        // return o1.compareTo(o2); // 오름차순
      }
});

혹은 리스트의 원소 클래스에서 Comparable 인터페이스를 수정하는 방법이 있다.

 

 

* 순차적으로 추가/삭제하는경우에는 ArrayList가 LinkedList보다 빠르다

  중간에 데이터를 추가.삭제 하는경우에는 LinkedList가 ArrayList 보다 훨씬! 빠르다

  특정요소에 접근할 경우에는 Arraylist가 빠르다

 

 

4. 배열

4-1) 일반 배열, List

type name[][] = { { ... }, { ... }, ... };

type name[][] = new type[size][size]; // 0

List<type> name = new ArrayList<>(); // dynamic

 

4-2) 벡터 구현

List<type> name[];

name = new List[size + 1];

for( int i = 0; i < size; i++ )

    name[i] = new ArrayList<type>();

 

4-3) Collection, Map

인터페이스 하위 인터페이스 구현 클래스 특징 비고
Collection Set HashSet
LinkedHashSet
SortedSet - Tree Set
순서X, 중복X  
List LinkedList
Vector - Stack
ArrayList
순서O, 중복O ArrayList - not Thread safe
Vector - Thread safe
Queue LinkedList
PriorityQueue
Deque - ArrayDeque
   
Map HashTable
HashMap
TreeMap
순서X,
Key 중복X, Value 중복O

 

 

 

 

5. 키워드 static

5-1) class를 설계할 때 멤버 변수 중 모든 인스턴스에서 공통적으로 사용할 변수에 static을 붙인다.

다시 말해, 각각의 인스턴스에서 같은 값으로 유지되어야 할 멤버 변수에 static을 붙인다.

즉, 키워드 static은 멤버 변수를 클래스 변수로 표시해주는 지시자

 

* 멤버 변수는 클래스 기반 언어에서 클래스 변수(혹은 정적 멤버 변수)와 인스턴스 변수로 나뉘어 구분될 수 있다.

** 클래스 변수 : 모든 인스턴스의 클래스와 공유되는 변수의 사본이 유일할 때

** 인스턴스 변수 : 클래스의 각 인스턴스가 자신만의 변수 복사본을 소유할 때

*** 멤버 변수 = 클래스 변수 + 인스턴스 변수, 지역 변수 = Method 내 변수

 

5-2) static이 붙은 멤버 변수는 인스턴스화 하지 않아도 사용 가능하다.

static이 붙으므로 클래스 변수가 되어 클래스가 메모리에 올라갈 때 생성되기 때문이다.

 

다른 시각으로, static이 붙은 멤버 변수는 인스턴스 변수로의 사용을 하지 못한다.

이미 메모리에 올라가 있기 때문이다.

 

5-3) 즉, 키워드 static을 표시할 것을 고려할 변수는 인스턴스 변수로 사용하지 않을 변수이다.

method 호출 시간이 줄어들기 때문에 효율적이기 때문이다.

 

결론) 인스턴스화 해야할 변수는 static을 붙이지 않아야 하고,

        인스턴스화 하지 않을 변수는 static을 붙이는 것을 고려한다.

 

+) 멤버 변수(클래스 변수, 인스턴스 변수)는 자동 초기화된다.

    지역 변수는 대부분 일부 계산을 위해 사용되는 변수로 기본 값으로 자동 초기화 될 경우 예상치 못한 출력이 생길 수 있기 떄문에 프로그래머가 액세스하기 편하도록 자동 초기화 되지 않는다. 즉, 에러를 통해 프로그래머에게 알린다.

 

 

6. JVM

 

 

7. 제어자(Modifier)

 · static

 · sbstract

 · final

 · 접근제어자 : private, default, protected, public

 

 

8. HashSet

HashSet<type> hs = new HashSet<>(); : 순서, 중복X

 

add(value), remove(value), contain(value) : 중복/존재 여부에 따라 T/F 리턴

clear(), size()

Iterator it = hs.iterator();

while(it.hasNext) syso(it.next);

 

CF) HashSet은 value, HashMap은 <key, value>

 

 

'알고리즘 > 알고리즘풀면서...' 카테고리의 다른 글

다시 풀어볼만한 문제 모음  (1) 2021.10.03
최단경로 알고리즘 정리 : 다익스트라, 벨만포드, 플로이드-와샬  (0) 2021.08.29
C/C++ 팁  (0) 2020.11.04
구현 팁  (0) 2020.10.31
SQL 팁  (0) 2020.10.22