Java Language 핵심만 빠르게 이해하기
Java language에 대한 기본적 이해를 위해 메모합니다.
주로 아래글을 참고했습니다.
gmlwjd9405.github.io/2017/10/01/basic-concepts-of-development-java.html
Class, Object(객체), Instance 차이
Class는 설계도이고 Object(객체)는 설계도로 만들 예정인 대상이며 Instance는 실제 만들어진 결과물입니다.
그러나 Class와 Object만 비교할때는 Object는 Instance와 동일한 의미로 쓰입니다. 즉, Class로 실제 만들어진 결과물을 Object라고 합니다.
건물을 예를 든다면 아래와 같습니다.
Class | Object | Instance |
단독주택 설계도 class House { private String houseName; private String purposeType; ... public House(String name) { this.houseName = name; } ... } |
a, b, c는 아직 만들어지진 않았지만 House라는 class로 구체화된 객체입니다. 어떤 Class로 만들어질지 선언만 합니다. House a, b, c; |
a, b, c는 실제로 만들어진 인스턴스입니다. 메모리상에 실제 할당됩니다. a = new House("bluehouse"); b = new House("greenhouse"); c = new House("redhouse"); |
그러나 Object를 Class가 Instance화한 결과물로도 해석하므로 Object와 Instance를 굳이 나눌 필요는 없습니다.
Parameter와 Argument 차이
parameter는 formal parameter와 actual parameter로 나눌 수 있는데 actual parameter가 argument입니다. 아래 예에서 값이 10인 argument ten을 parameter something으로 넘기는 것입니다. |
call by value vs call by reference
call by value는 값 자체가 인자로 넘어가는 것이고, call by reference는 포인터만 인자로 넘어가는 겁니다.
아래 C 코드로 그 차이를 알 수 있습니다.
call by value는 actual parameter의 값을 formal parameter로 복사하여 전달합니다. 따라서 caller의 x와 callee의 first, caller의 y와 callee의 second는 완전히 분리된 변수입니다. 각각 자기 함수내에서 Local 변수로 동작합니다.
call by reference는 포인터(주소값)이 전달되므로, caller와 callee가 같은 곳을 바라보게 됩니다. 따라서 callee에서 변수를 변경하면 caller도 동일한 위치를 가리키고 있으므로 변경된 값을 얻게 되는겁니다.
Call by value | Call by reference |
[출처] Mussebio's HuRrah : Java 인자 전달 방식
그럼 java는 call by value로 argument를 전달할까요? call by refrence로 전달할까요 ?
Java는 argument를 parameter에 전달할때 call by value로 합니다.
public class Person {
private String mName;
public Person(String name) {
mName = name;
}
public void setName(String name) {
mName = name;
}
@Override
public String toString() {
return "Person " + mName;
}
}
따라서 아래와 같이 결과는 'sam'이 됩니다. caller의 sam과 callee의 p는 값이 복사되어 전달되기 때문에 분리된 객체입니다.
그러나 여기서 복사되는 값(value)가 정확히 뭔지를 이해하는게 핵심입니다.
아래에서는 마치 call by reference인것처럼 Name이 변했습니다.
Java에서 인자로 넘기는 Value는 객체의 주소가 아닌 인스턴스의 주소입니다.
이해가 안되면 현재 글의 젤 처음에 나오는 Class, Object, Instance의 차이를 다시 보십시오.
그래서 'sam'객체는 바뀌지 않는거고, 'sam'인스턴스의 속성만 바뀌는 것입니다.
static과 non-static
Class의 멤버(속성 또는 메소드)를 정의할 때 멤버 앞에 static을 붙이면 static멤버이고, 없으면 non-static 멤버입니다.
static 멤버는 Class당 공간이 할당되고, non static멤버는 인스턴스당 공간이 할당됩니다.
static 멤버는 Class만 로딩 되면 접근할수 있고, non static멤버는 인스턴스 생성 후에나 접근할 수 있습니다.
쉽게 말해 static멤버는 class의 전역변수처럼 처리되고 non static 멤버는 각 인스턴스의 로컬변수처럼 처리됩니다.
class StaticSample {
int ; // non-static 필드
void g() {...} // non-static 메서드
static int m; // static 필드
static void f() {...} // static 메서드
}
[출처] https://gmlwjd9405.github.io/2018/08/04/java-static.html
아래 예제에서처럼 static멤버는 class이름으로도 접근 가능하며, 인스턴스(또는 객체)들이 마치 전역변수처럼 사용합니다.
class StaticSample {
public static int m;
public static void f() { m = 5; }
}
public class Main {
public static void main(String args[]) {
StaticSample s1, s2;
//static변수는 instance생성 없이 class이름으로 접근 가능
StaticSample.m = 50;
System.out.println(StaticSample.m); // result: 50
s1 = new StaticSample();
s1.m = 50; // static
s2 = new StaticSample();
s2.f(); // static
System.out.println(s1.m); // result: 5
System.out.println(s2.m); // result: 5
}
}
보다 자세한 내용은 아래를 참조하세오.
gmlwjd9405.github.io/2018/08/04/java-static.html
Interface와 Abstract class의 차이
Abstract class는 자식class들의 공통된 메소드를 선언만 하고, 구현은 각 자식 class가 하는 class입니다.
Interface는 서로 관련 없는 Class들의 공통된 메소드를 선언만 하고, 구현은 각 class가 하는 구조체입니다.
[출처] loustler 블로그: 인터페이스와 추상클래스
예제 소스
ablstract class | interface |
abstract class Shape { abstract void draw( ); //메소드 앞에 abstract가 있으면 추상메소드다. void hit(int x) { x=3; } } |
interface Shape { void draw( ); //인터페이스에서는 abstract 생략가능하다. abstract void move(int y); } |
class Triangle extends Shape //abstract클래스는 상속처럼 extends를 쓴다. { void draw( ) //이렇게 일반 메소드 형태로 구현해줘야 한다. { System.out.println("삼각형을 그린다"); } ... //hit( )는 필요시 재정의하고 아니면 상속이니 있는걸로 간주하면 된다. } |
class Triangle implements Shape //interface는 implements로 상속을 받는다. { public void draw( ) //이렇게 일반 메소드 형태로 전부 구현해줘야 한다. { |
보다 자세한 것은 "강이"의 JAVA강좌: 자바의 추상클래스와 인터페이스를 참조하십시오.
Collection과 Map
각 Interface/class에 대한 자세한 내용은 아래 글의 제일 하단쯤에 있는 내용을 참조하세요.
gmlwjd9405.github.io/2017/10/01/basic-concepts-of-development-java.html
Java annotation 목록
특히 springboot는 단순하고 편한 개발을 위해 annotation(@로 시작하는 주석)을 매우 많이 사용합니다.
많이 사용하는 annotation을 정리한 글이 있어 공유합니다
Heee's Development blog : Spring annotation의 종류와 그 역할
Java SprintBoot 개발 순서
DAO(Data Access Object)사용시 일반적인 개발 순서입니다. 저마다 개취가 있으니, 참고만 하십시오.
1) pom.xml
- dependency 라이브러리를 추가
2) application.properties
3) DAO interface 생성
4) VO class 생성
5) Controller class 생성