객체 - Java
속성 - field
행위 - method
function(함수)가 Class에 소속되어 있을때
Method라 부른다.
Method는 입력(Input), 기능(Function), 출력(Output)으로 구성된다.
메소드의 역할은 해당클래스의 데이터에 대한 제어이다.
따라서 특정 클래스의 데이터, 즉 필드 값의 변경은 곧 해당 클래스의 특정행위가 수행되는 것을 의미한다.
Class는 다수의 Method를 가질 수 있으며, 그 메소드의 기능은 메소드를 호출함으로 수행된다.
Field와 마찮가지로 메소드에도 저근 지정자(Public, Private, Protected, Default)를 지정하여 해당 메소드의 호출에 대한 범위를 지정할 수 있다.
메소드는 static키워드를 이요하여 클래스 메소드와 인스턴스 메소드로 정의 할 수 있다.
반환타입이 없을 경우 void를 넣고 return을 하지 않는다.
파라미터가 없을 경우에는 ()를 비워둔다.
static - class methods
No static - instance method
메소드가 클래스의 소속일때는 static, instance의 소속일때는 static을 붙히지 않는다.
인스턴스 메소드는 인스턴스를 반드시 만들어야 기능을 수행할 수 있다.
class Print{
public String delimiter;
public void a() {
System.out.println(this.delimiter);
System.out.println("a");
System.out.println("a");
}
public void b() {
System.out.println(this.delimiter);
System.out.println("b");
System.out.println("b");
}
public static void c(String delimiter) {
System.out.println(delimiter);
System.out.println("b");
System.out.println("b");
}
}
public class staticMethod {
public static void main(String[] args) {
// Print.a("-");
// Print.b("-");
// instance
Print t1 = new Print();
t1.delimiter = "-";
t1.a();
t1.b();
Print.c("$");
// Print.a("*");
// Print.b("*");
Print t2 = new Print();
t2.delimiter = "*";
t2.a();
t2.b();
}
}
메소드 오버로딩(Overloading)
메소드의 이름을 같게 하고, 파라미터를 달리 하여 여러 메소드를 정의하는 방법을 메소드 오버로딩이라고 한다.
자바의 메소드 시그니처(signature)는 메소드의 이름부터 파라미터까지 이므로 메소드의 반환타입은 메소드의 시그니처에 포함되지 않는다.
메소드 오버로딩은 하나의 클래스내에서의 기능이며 파라미터는 타입, 순서, 개수를 달리하여 구분할 수 있다.
생성자(Constructor) (No static method)
생성자는 클래스 구성요소 중 하나로 반드시 속한 클래스의 이름과 같은 이름을 가져야한다. 객체를 인스턴스화 할 때 가장 먼저 호출되는 특수한 메소드이다.
그 역학은 객체가 갖는 필드의 초기화이며 따라서 모든 클래스는 하나이상의 생성자를 갖는다.
생성자의 이름은 해당 클래스의 이름과 같고 반환 타입을 갖지 않는다.
생성자도 모든 접근제어자를 적용할 수 있으며 일반적으로 public접근제어자가 적용된다.
매개 변수가 없고 구현 내용 없이 정의하는 생성자
클래스는 반드시 하나 이상의 생성자를 가지며 사용자가 생성자를 정의하지 않으면 디폴트 생성자가 자동으로 생성된다.
생성자에서 명시적으로 필드의 값을 설정하지 않으면 디폴트 값으로 초기화된다.
그 형태는
public class Name {
public Name() {
...
}
}
이다.
클래스 필드의 초기화를 위해서 정의하는 생성자
이는 해당 클래스가 갖는 필드의 초기화를 위해 정의하며 여러 형태로 정의가 가능하다.
만일, 하나 이상의 사용자 정의 생성자를 만들었다면 디폴트 생성자가 자동으로 생성되지 않는다. 따라서, 따로 개발자가 디폴트 생성자를 만들어 주어야 오류없이 컴파일이 가능하다.
그 형태는
public class Name {
public Name(매개변수 타입 매개변수이름) {
...
}
}
생성자의 오버로딩
메소드와 마찮가지로 하나의 이름(클래스와 동일)에 매개변수의 다른 타입, 개수, 순서를 이용하여 여러가지 생성자를 정의할 수 있고 이를 생성자 오버로딩이라 한다.
객체의 인스턴스화 과정에서 생성자를 호출하며 이때 매개변수에 필요한 전달인자를 달리하여 필요한 생성자를 호출한다.
*이때 매개변수의 타입, 개수, 순서외에는 다름을 인식하지 않는다.
ex)
Public Name(String name, int age){} 와
Public Name(String department, int age){} 의 차이를 인식하지 못한다.
This 생성자
생성자의 호출은 메서드의 호출과 다르다.
메서드는 여러번 호출 할 수 있지만
생성자는 객체를 인스턴스할때만 호출할 수 있다. 다시 인스턴스화 하지 않는이상 호출 불가
이때, 하나의 클래스에 정의된 다수의 생성자간에 중복되는 코드(파라미터)들을 this()생성자를 통해 서로 호출 할 수 있다.
this()생성자의 호출은 반드시 생성자 이름의 바로 아래에 위치한다.
ex)
public class Employee{
private String id;
private String name;
private String department;
public Employee() {}
public Empoloyee(String id){
this.id = id; // 매개변수 초기화
System.out.println("Employee(id) 호출");
}
public Empoloyee(String id, String name){
// this() 생성자를 통해 앞선 생성자를 호출하여 사용할 수 있다.
this(id;)
this.name = name;
System.out.println("Employee(id, name) 호출");
}
}
Java의 메모리 모델
Java의 JVM이 관리하는 메모리 공간은 3가지 영역으로 나뉨
1. Stack Area: 지역변수, 매개변수가 할당되는 영역으로 초기화가 진행되지 않는다.
2. Heap Area: 배열과 모든 인스턴스 객체가 할당되는 영역으로 자동 초기화가 진행된다.
3. Static Area(Method Area): 메소드의 바이트 코드, static 변수가 할당된다.
Static 과 Final
static 과 final키워드는 클래스, 필드, 메소드에 모두 적용할 수 있는 키워드이며 각 위치에 따라 다른 의미를 갖는다.
-static 키워드는 정적 키워드로 정적 필드(클래스 변수), 정적 메소드를 선언할때 사용
-final 키워드는 초기 한번의 초기화만 가능, 이후에 다른 값을 대입할 수 없다.
final키워드는 클래스,필드,메소드,지역변수,파라미터에 적용가능
-클래스에 final은 상속을 허용하지 않으며 메소드의 final은 오버라이딩 금지를 의미
-필드, 지역변수, 파라미터에 final을 적용하면 한번 초기화 한 이후에는 다른 값으로 변경할 수 없다.
-final 필드의 초기화 방식은 필드 선언 시점의 초기화, 초기화 블록, 생성자를 통한 초기화 방법 3가지가 있다.
사용자 정의 상수
정적 필드(static field)에 final 키워드를 적용하여 값을 변경할 수 없도록 하는 것으로 사용자 정의 상수를 정의
정적 필드나 메소드의 접근과 마찬가지로 클래스 이름을 통해 접근하여 사용
접근 지정자의 범위에 따라 공유하는 범위가 결정됨
사용자 정의 상수는 대문자 표기를 하고 합성어는 _를 이용한다.
static method
정적 메소드는 static으로 선언된 메소드로 인스턴스 없이 호출할 수 있다.
정적 메소드는 인스턴스 필드에는 접근할 수 없고, 정적 필드에만 접근할 수 있다.
정적 메소드는 객체를 통해 사용될 수 있지만, 반드시 클래스명과 함께 사용하는것이 좋다.
객체의 상태(field)에 접근하지 않고, 필요한 파라미터가 모두 명시적 파라미터인 경우 사용하는 것이 좋다.(Math.pow)
클래스의 정적필드에만 접근하는 경우 사용하는 것이 좋다.
static field에는 static method와 instance method 둘다 접근이 가능하다.
하지만 instance field에는 instance method만 접근이 가능하다.