Fundamental
μλ£ν
Java μ μλ£νμ κΈ°λ³Έ (μμ) νμ κ³Ό μ°Έμ‘° νμ μΌλ‘ ν¬κ² λλλ€.
κΈ°λ³Έ νμ μ μλμ κ°λ€.
λ°μ΄ν°ν | μμ½μ΄ | λΉνΈμ(λ°μ΄νΈμ) | λ²μ |
---|---|---|---|
λ Όλ¦¬ν | boolean | 8 Bit (1 Byte) | true or false |
λ¬Έμν | char | 16 Bit μ λμ½λ (2 Byte) | μμΉλ‘λ 0 ~ 65535('\u0000'~'\uFFFF') μ λμ½λ:μμ΄,μ«μ-1λ°μ΄νΈ, κ·ΈμΈ λ€κ΅μ΄-2λ°μ΄νΈ |
μμΉν(μ μ) | byte | 8 Bit (1 Byte) | -128 ~ 127(-2μ7μ κ³±~2μ7μ κ³±-1) 2^8 |
μμΉν(μ μ) | short | 16 Bit (2 Byte) | -32,768 ~ 32,767(-2μ15μ κ³±~2μ15μ κ³±-1) 2^16 |
μμΉν(μ μ) | int | 32 Bit (4 Byte) | -2,147,483,648 ~ 2,147,483,647(-2μ31μ κ³±~2μ31μ κ³±-1) 2^32 |
μμΉν(μ μ) | long | 64 Bit (8 Byte) | -9,223,372,036,854,775,808~9,223,372,036,854,775,807 (-2^63 ~ 2^63-1) 2^64 |
μμΉν(μ€μ) | float | 32 Bit (4 Byte) | Β±3.40282347E+38, Β±1.40239846E-45 IEEE 754-1985νμ€ |
μμΉν(μ€μ) | double | 64 Bit (8 Byte) | -1.79769313486231570E308~+1.79769313486231570E308 |
κΈ°λ³Ένμ μ κ°μ₯ ν° νΉμ§μ λ³νμ§ μλλ€λ λΆλ³ (immutable) μμ±μ κ°μ§κ³ μμΌλ©° κ° μ체λ₯Ό κ°μ§κ³ μλ€.
μ°Έμ‘° λ°μ΄ν°νμ λ°°μ΄, ν΄λμ€, μΈν°νμ΄μ€ λ±λ±μΌλ‘ κΈ°λ³Ένμ μ μ μΈν μ΄μΈμ κ²λ€μ κ°λ₯΄ν€λ©° κ°μ΄ μλ λ°μ΄ν°μ λν μ°Έμ‘° μ£Όμλ₯Ό κ°μ§κ³ μλ€.
μ°Έκ³ μλ£
JDK & JRE μ°¨μ΄μ
JDK (Java Development Kit)
Java μ μμ©νλ‘κ·Έλ¨μ κ°λ°ν μ μλ μννΈμ¨μ΄ κ°λ° ν€νΈμ΄λ€.
JRE (Java Runtime Environment)
Java νλ‘κ·Έλ¨ μ½λκ° μ€νλλ JVM μ μ§μΉν¨
static
ν€μλμ μλ―Έ
Java Class μ λ©€λ² λ³μ λλ λ©μλκ° μν ν΄λμ€μ μΈμ€ν΄μ€νλ₯Ό μꡬνμ§ μκ³ μ‘μΈμ€ ν μ μλ μ κ·Όμ μ΄μ μ
λλ€.
static
μ κ·Ό μ μ΄μλ‘ μ§μ λ λ³μ νΉμ λ©μλλ Java Runtime μμ Compile μμ μ μ μΌλ‘ λ°μΈλ© λκΈ° λλ¬Έμ μ¬μ μ (μμ ) μ΄ λΆκ° ν©λλ€.
μΈν°νμ΄μ€ (interface) μ μΆμ ν΄λμ€(abstract) μ 곡ν΅μ & μ°¨μ΄μ
μΈν°νμ΄μ€ (interface) μ μΆμ ν΄λμ€ (abstract) λ κ·Όλ³Έμ μΌλ‘ λ€λ₯Έ λͺ©μ μ μν΄ κ΅¬νλλ€.
interface | abstract | |
---|---|---|
λͺ©μ | ν¨μμ ꡬνμ κ°μ ν | μμμ ν΅νμ¬ κΈ°λ₯μ μ΄μ©νκ³ νμ₯ν¨ |
ꡬν λ°©μ | λ°λμ λͺ¨λ λ©μλλ₯Ό ꡬν | λͺ¨λ λ©μλλ₯Ό ꡬννμ§ μμλ λ¨ |
λ€μ€ μμ | κ°λ₯ | λΆκ° |
μ κ·Ό μ μ΄μ | public | private , protected , public |
λ³μ | κΈ°λ³Έμ μΌλ‘ final λ‘μ¨ μ΅μ’
λ³μμ | λΉ μ΅μ’ λ³μλ₯Ό ν¬ν¨ν μ μμ |
Java 8 μ΄μ κΉμ§λ Interface μμ static λ©μλλ₯Ό μ μΈν μ μμλ€.
μ΄λ static ν΄λμ€μΈ κ²½μ°μλ ν΄λμ€ μμ²΄κ° JVM κΈ°λνλ©΄μ λ°λ‘ λ‘λ© λλ€.
Interface λ Abstract Class μΈ κ²½μ° ν΄λμ€κ° μμ±λμ΄μ§ μ΄νμ ν΄λΉ κ°μ²΄λ₯Ό Reference νκ² λλ€.
μλμ μΌλ‘ λ‘λ©μκ°μ΄ μμ μλ static ν΄λμ€μ λν΄μλ interface λ Abstract ν΄λμ€μ ꡬνμ΄ λΆκ°νλ€
μΌλ°μ μΌλ‘ μΆμν΄λμ€λ₯Ό μμλ°λ κ²½μ°λ κ²°ν©λκ° κ°νκΈ° λλ¬Έμ μΈν°νμ΄μ€ ꡬνμ ν΅νμ¬ κ΅¬ννλκ²μ κΆμ₯νλ€.
Call By Value & Reference μ μ°¨μ΄
Java μμ Call By Value λ₯Ό ν΅ν κ° μ λ¬ λ°©μμ κ°μ²΄μ 볡μ¬λ³Έμ΄ μ λ¬λλ€λ κ²μ μλ―Ένλ€.
μ¦ μλ³Έ λ°μ΄ν°μ μν₯μ μ£Όμ§ μλλ€. κ°μ²΄κ° μ°Έμ‘°λ‘ μ λ¬λλ©΄ μ΄λ μ€μ κ°μ²΄κ° μ λ¬λμ§ μλ μ°Έμ‘°κ°μ²΄μ μ λ¬ μ μλ―Ένλ€.
CBV (Call By Value) μ CBR (Call By Reference) μ λΉκ΅μλ‘λ νν λ€μκ³Ό κ°λ€.
equals
μ ==
μ μ°¨μ΄
λ¬Έμμ΄ λΉκ΅μμ ννκ² μ¬μ©νμ§λ§ λ°νκ°μ΄ boolean
μ΄λΌλ 곡ν΅μ μ΄ μμ§λ§ λ€μκ³Ό κ°μ μ°¨μ΄μ μ΄ μλ€.
equals
- λ©μλ
- λμμ λ΄μ©μ λΉκ΅
==
- μ°μ°μ
- λμμ μ£Όμκ°μ λΉκ΅
String A = "abc";
String B = A;
String C = new String("abc");
System.out.println(A == B); // true
System.out.println(A == C); // false
System.out.println(B == C); // false
System.out.println(A.equals(B)); // true
System.out.println(A.equals(C)); // true
System.out.println(B.equals(C)); // true
μ°Έκ³ μλ£
equals
μμ κ°μμ μ μν λ hashCode λ κ°μ΄ μ μν΄μ€μΌ νλ€.
κ°μ²΄λ₯Ό equals
λ©μλλ‘ λ΄μ©μ κ°μμ μ μνμμμλ λΆκ΅¬νκ³ μλ‘ λ€λ₯Έ κ°μ²΄ μ°Έμ‘°μμ μ΄λ£¨μ΄μ‘μλμ μμΈμ²λ¦¬κ° νμν κ²½μ°λ μκΈ° λλ¬Έμ΄λ€.
μ¦ λ€λ₯Έ λΆμμ©μ΄ μκΈΈ μ¬μ§κ° μκΈ° λλ¬Έμ΄λ€.
Set<Person> set = new HashSet<>();
Person p1 = new Person("JDK", 27);
Person p2 = new Person("JDK", 27);
System.out.println("Person 1 : " + p1.hashCode()); // 2018699554
System.out.println("Person 2 : " + p2.hashCode()); // 1311053135
set.add(p1);
set.add(p2);
System.out.println(set.size()); // 2
μμμ κ°μ λ΄μ©μ κ°μ§ Object
μμλ λΆκ΅¬νκ³ Set
μ 2κ±΄μ΄ μ€λ³΅μΌλ‘ μ
λ ₯λμλ€.
μ¦ λ°λμ equals
λ‘λ κ°μ κ°μ²΄λΌλ©΄ λ°λμ hashCode λ κ°μ κ° μ΄μ¬μΌλ§ νλ€.
μ°Έκ³ μλ£
hashCode()
μ λν΄
μΌλ°μ μΌλ‘ Hash
λ₯Ό μ¬μ©ν Collection
(HashMap
, HashTable
, HashSet
, LinkedHashSet
... ) μμ κ°μ²΄μ Key λ₯Ό κ²°μ ν λ HashCode λ₯Ό μ¬μ©νλ€.
μ΄λ μλ‘ λ€λ₯Έ κ°μ²΄μ λΉκ΅λ₯Ό μν΄μλ μ¬μ©λλλ° ==
κ° λνμ μ΄λ©° Hash κ°μ κ°μ μ μΌλ‘ μ£Όμ
μμΌ κ°μ²΄λ₯Ό κ°κ²λ μ€μ ν μλ μλ€.
μλλ λνμ μΈ HashCode μ μμ±λ‘μ§μ΄λ€.
public int hashCode() {
final int prime = 31;
int hashCode = 1;
hashCode = prime * hashCode + ((name == null) ? 0 : name.hashCode());
hashCode = prime * hashCode + age;
return hashCode;
}
31 μ μΉμλ‘ μ¬μ©νλ μ΄μ ?
31
κ°μ μμμ΄λ©° μ΄λ€μμ 31
μ κ³±νλκ² λν λΉ λ₯΄κ² μ°μ° κ°λ₯νλ€.
νΉμ κ°μ 31N = 32N - N
μΈλ° νΉμ κ°μ 32μ κ³±νκ°μ shift μ°μ°μΌλ‘ μ½κ² ꡬν κ°λ₯νλ€.
λ°λΌμ νΉμ κ° N μ N << 5 - N
κ³Ό κ°μΌλ―λ‘ 31μ κ³±ν μ°μ°μ μ΅μ νλ λ¨Έμ μ½λλ‘ μμ± κ°λ₯νλ€.
λ°λΌμ String ν΄λμ€μμ ν΄μκ°μ κ³μ°ν λμλ 31μ μΉμλ‘ μ¬μ©νλ€.
HashCode μ κ²°μ μ hashCode()
λ©μλμμ native call μ νμ¬ Memory μμ κ°μ§ Hash Address κ°μ μΆλ ₯νλ€.
νΉλ³νκ² μ€μ μ΄ μλ κ²½μ°μλ κΈ°λ³Έκ°μΌλ‘ System.identityHashCode()
μ λμΌν κ°μ λνλΈλ€.
String
μ ν΄λμ€μ hashCode()
λ©μλλ Object
ν΄λμ€μ hashCode()
μ λ¬λ¦¬ @Override
λμ΄ μλ μνμ΄λ€.
String a = "a";
String _a = new String("a");
// a
System.out.println(a);
// a
System.out.println(_a);
// false
System.out.println(a == _a);
// true
System.out.println(a.equals(_a));
// true
System.out.println(a == _a.intern());
// 97
System.out.println(a.hashCode());
// 97
System.out.println(_a.hashCode());
// 97
System.out.println(_a.intern().hashCode());
// 708049632
System.out.println(System.identityHashCode(a));
// 1887400018
System.out.println(System.identityHashCode(_a));
// 708049632
System.out.println(System.identityHashCode(_a.intern()));
λλ¬Έμ μ€μ ν
μ€νΈ κ²°κ³Ό String ν΄λμ€μ Object ν΄λμ€μ hashCode()
λ©μλμ κ²°κ³Όκ° μμ΄νλ€.
Object a = new Object();
Object _a = new Object();
// false
System.out.println(a == _a);
// false
System.out.println(a.equals(_a));
// 708049632
System.out.println(a.hashCode());
// 1887400018
System.out.println(_a.hashCode());
// 708049632
System.out.println(System.identityHashCode(a));
// 1887400018
System.out.println(System.identityHashCode(_a));
μ°Έκ³ μλ£
https://nesoy.github.io/articles/2018-06/Java-equals-hashcode
http://blog.naver.com/PostView.nhn?blogId=travelmaps&logNo=220931531769&redirect=Dlog&widgetTypeCall=true
κ°μ²΄ μ¬μ¬μ©
λνμ μΌλ‘ Singleton
λμμΈ ν¨ν΄κ³Ό κ°μ΄ 미리 μ¬μ μ μμ±λ Instance
λ₯Ό μ¬μ¬μ©νλ λ°©μμΌλ‘ μΌλ°μ μΌλ‘ ThreadPool
μ΄λ Connection Pool
λ±μ λ°©μμΌλ‘ μ£Όλ‘ μ¬μ©νλ€.
μ΄κΈ°ν λΈλ (Initialization Block)
ν΄λμ€ μ΄κΈ°ν λΈλκ³Ό μΈμ€ν΄μ€ μ΄κΈ°ν λΈλμ΄ μλ€.
public class TEST {
static int a;
int b;
static {
System.out.println("Static initialization"); // 1
}
{
System.out.println("Instance initialization"); // 2 // 4
}
public TEST() {
System.out.println("Constructor"); // 3 // 5
}
public static void main(String[] args) {
new TEST();
new TEST();
}
}
Static initialization
Instance initialization
Constructor
Instance initialization
Constructor
Reflection
리νλ μ μ΄λ κ°μ²΄μ ν΄λμ μ 보λ₯Ό λΆμν΄ λ΄λ νλ‘κ·Έλ¨ κΈ°λ²μ λ§νλ€.
reflection μ μ¬μ μ μΈ μλ―Έν¬μ λ° λ°μ¬μ λλ€.
μ΄λ μ€νμ€μΈ μλ° νλ‘κ·Έλ¨μ λ΄λΆλ₯Ό κ²μ¬νκ³ κ·Έ μμ±μ μμ ν μ μλλ‘ νλ€.
μ½κ² λ§ν΄ κ°μ²΄λ₯Ό ν΅νμ¬ ν΄λμ€μ μ 보λ₯Ό μμΌλ‘ λΆμν΄λ΄λ νλ‘κ·Έλλ° κΈ°λ² μ λ§νλ€.
Class aClass = Test.class;
Class myObjClass = Class.forName(className);
Package pkgOfAClass = aClass.getPackage();
μ¬μ©
λμ μΌλ‘ λ‘λ©νκ³ λμ μΌλ‘ μ€ννκ³ μΆμλ μ£Όλ‘ μ¬μ©λλ€.
μ¬μ¬μ©μ±, νμ₯μ±, μμ°μ±, μ μ°μ± λ±μ΄ κ·Ήλνλ μ μλ κ³³μ΄μ¬μΌ ν¨κ³Όμ μ΄λ€.
μ΄μ
Runtime μμ λμ μΌλ‘ μνλ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ‘λ©ν μ μλ μ₯μ μ΄ μμ§λ§
μ»΄νμΌμμ νμ (Detection) μ΄ μλμ΄ Runtime Exception μ΄ μκΈΈμ μλ λ¨μ μ΄ μ‘΄μ¬ νλ€.
보ν΅μ λμ λ‘λ©μ΄ λ리λ€κ³ μ ν΄μ§λ€ (νμΈλΆκ°)
Access Modifier β