[x] IntelliJ 설치하기
IntelliJ IDEA: 우수성과 인체 공학이 담긴 JetBrains Java IDE
# 인텔리제이 명령어 정리
빠른 수정 : Alt + Enter
코드 작성 중 새로운 클래스나 폴더 추가 (커서 변경) : Alt + 1
// ESC를 누르면 다시 코드로
Alt + Insert : 클래스 생성
Shift + Shift : 원하는 클래스 찾기
Ctrl + W / Ctrl + Shift + W 블록 확장 or 축소
Ctrl + / : 주석 지정
Ctrl + Alt + L : 코드 Reform (깔끔한 코드 유지)
Shift + Ctrl + Alt + T : 리펙토링 메뉴
Shift + Ctrl + A : 액션 검색 (어디 메뉴인지 모를때 검색해서 사용)
[추가]
자동완성 : ctrl + space
assertions등 라이브러리 import : ctrl + space 2번 + 형광등에서 static import 선택
생성자, getter, setter : getter, setter all 단축키 alt+insert
출력 sout으로 sysout 활용
실행 : ctrl + shift + fn + f10 / 이전에 했던거 바로 실행 : shift +fn + f10
rename, 지정한 변수 위에서 : shift +fn+ f6
주석 : 블럭 주석 - ctrl shift+/
변수 자동 입력 : ctrl + alt + v
리펙토링 메소드 : ctrl + shift + alt + t ==> extract method
==> ctrl+alt+m ==> 해당 부분 메소드 블록 선택 ==> 메소드 이름 지정
만든 로직을 테스트 하는 단축키 : ==> 클래스 위에서 ctrl + shift + t
import 정리 ( 사용하지 않는 import 정리) : ctrl + alt + o
이전화면으로 화면 바꾸고 싶을떄 : ctrl + E
람다로 변경 : return 쪽에서 alt + enter ==> replace
인라인 (불필요한 코드를 없애는것) : alt + ctrl + enter
자동 들여 쓰기 : ctrl + alt + l
StringBuffer & StringBuilder 코드 상 비교
StringBuffer : Thread-Safe (멀티 쓰레드 환경에서 사용)
StringBuilder : Thread-Safe 하지 않음, StringBuffer보다 성능 좋음
# 전역변수로 StringBuilder를 선언하면 여러 쓰레드에서 동시에 접근하게되고 StringBuilder는 쓰레드에 안전하지 않기 때문에 자연스럽게 문제가 생김
public class Service {
static StringBuilder sb = new StringBuilder();
public void do() {
sb.append("추가");
sb.append("추가");
}
}
# 지역변수로 StringBuilder를 선언하면 쓰레드가 메소드를 수행할 때 객체가 생성되고 쓰레드마다 서로 다른 객체를 사용하게 되요. 그렇기 때문에 멀티쓰레드 환경에서 아래와 같이 코딩을 하여도 전혀 문제가 없고, 문자열 조합이 무지하게 많이 발생하는 경우 StringBuffer를 사용할 때보다 성능상으로 유리
public class Service {
public void do() {
StringBuilder sb = new StringBuilder();
sb.append("추가");
sb.append("추가");
}
}
선택 과제 Object Class
extends 키워드로 다른 클래스를 상속하지 않으면 기보적으로 java.lang.Object 클래스를 상속
Object는 자바의 최상위 부모 클래스에 해당
1. 객체 비교 (equals())
package com.prgramers.java02;
public class ObjectUse {
public static void main(String[] args) {
// Equals
String aa="aaa";
String bb=aa;
String cc=new String("aaa");
// Equals 확인
System.out.println(aa.equals(bb)); // 타입, 필드값이 같으므로 True
System.out.println(aa==bb); // 가리키는 주소값이 같으므로 True
System.out.println(aa==cc); // 주소값이 다르므로 false
System.out.println(aa.equals(cc)); // 타입, 필드값이 같으므로 True
}
}
객체를 식별할 하나의 정수값 (객체의 주소값을 변환)
두 객체가 동일 객체인지 비교할때 사용
HasSet, HashMap, Hashtable등 두 객체가 동등한지 비교
HashCode()는 String에서 중복 가능성이 있음
31*h+ascii 값의 연산을 하기 때문에 특정 문자열 조합에서 동일한 정수값을 가지는 경우가 존재
//HashCode
String a="Z@S.ME";
String b="Z@RN.E";
System.out.println(a.hashCode()); //-1656719047
System.out.println(b.hashCode()); //-1656719047
하지만 equals()를 통해 key값이 따르기 때문에 Map의 고유 key를 사용할 경우에는 중복되지 않은 값임을 인지
eqauls() - False / hasCode() - True : HashMap 다른 Key로 처리
eqauls() - True/ hasCode() - False : HashMap 다른 Key로 처리
eqauls() - True / hasCode() - True : HashMap 같은 Key로 처리
객체의 문자 정보를 Return
메소드를 재정의하여 사용 (객체의 정보를 알고 싶을 때 사용)
package com.prgramers.java02;
public class SmartPhone extends Object{
private String company;
private String os;
public SmartPhone(String company, String os) {
this.company = company;
this.os = os;
}
@Override
public String toString() {
return "SmartPhone{" +
"company='" + company + '\'' +
", os='" + os + '\'' +
'}';
}
}
// ToString()
SmartPhone ph=new SmartPhone("SamSung","and");
String value=ph.toString();
System.out.println(value);