인프런 Do it! 자바 프로그래밍 입문 5장~6장
함수는 그 이름에 맞게 하나의 기능을 구현하는 것이 적절
접근제어자 반환형 함수식별자(매개변수){
수행내용
return 반환값
}
스택메모리는 지역변수와 함수가 적재되는 공간
public int f1() {
int a, b;
return a+b;
}
public int f2(){
int a, b, c;
return a*b*c;
}
함수가 호출되면 스택에 적재
리턴되는 등 함수가 종료되면 스택에서 제거
f1은 int형 변수 두 개가 있으므로, 스택에서 8byte의 공간 사용f2는 int형 변수 세 개가 있으므로, 스택에서 12byte의 공간 사용접근제어자 class 클래스식별자 {
필드
메소드
}
java는 최상위 클래스로 Object를 가짐
국룰
.java파일에 하나의 클래스 정의문법상 규칙
.java파일에 클래스가 여러개가 있을 수 있음. .java파일내에 public 클래스는 하나만 존재해야 하고 파일명과 식별자가 같아야 함클래스(static code)를 인스턴스화 하면 힙 메모리에 올라가 인스턴스가 됨.
객체를 생성한다는 것과 대체로 유사한 말
new키워드 사용하여 객체 생성new Gorani()로 기본생성자 호출g는 원시 타입이 아닌 레퍼런스 타입// Test.java
package classpart;
public class Test {
public static void main(String[] args) {
Gorani g = new Gorani();
g.id = 53;
g.name = "wonjin";
g.showInfo(); // 53, wonjin
}
}
// Gorani.java
package classpart;
public class Gorani {
int id;
String name;
public void showInfo() {
System.out.println(id + ", " + name);
// System.out.println(this.id + ", " + this.name); 과 동일한 결과
}
}
인스턴스가 저장되는 공간
스택 메모리로부터 참조되는 동적 데이터 영역
참조가 해제된 힙영역의 데이터는 Live객체가 아닌 쓰레기로 분류된다. 이는 가비지콜렉터에 의해 정리된다.
────── ──────
스택 힙
g ────▶ id
name
────── ──────
수식어 클래스식별자(매개변수){
수행내용
}
생성자를 아무것도 정의되지 않으면 기본생성자가 자동구현된다.
package classpart;
public class Gorani {
int id;
String name;
public Gorani() {
// this키워드로 생성자 호출시, 그 이전에는 어떤 문장도 올 수 없음
this(-1, "UNDEFINED");
}
public Gorani(int id, String name){
this.id = id; // this.id는 이 객체의 멤버변수를, id는 매개변수를 의미
this.name = name;
}
public void showInfo() {
System.out.println(this.id + ", " + this.name); // 역할 1
}
public Gorani returnThis() {
return this; // 인스턴스 자신의 주소
}
}
어떤 필드, 메소드에 static키워드를 붙일 수 있음.
이런 멤버는 인스턴스별로 메모리를 할당하는 것이 아니라, 클래스 전체에 걸쳐 공유하는 멤버임.
코드, 데이터, 스택, 힙 영역
static멤버는 프로그램이 메모리에 적재될 시점에 데이터 영역에 메모리를 할당받음
new키워드로 객체가 생성되는 것과 static멤버가 메모리에 적재되는 것은 관계없음.
전체 시스템에서 오직 1개의 인스턴스만 존재하도록 구현하는 방식
// Test.java
package classpart;
public class Test {
public static void main(String[] args) {
Gorani g = Gorani.getInstance();
g.bark(); // kwakaaaakakakawawak!!!!!!!!!!!!!!
}
}
// Gorani.java
package classpart;
class Gorani {
private static Gorani instance = new Gorani();
private Gorani() { // private 생성자
System.out.println("born");
}
public static Gorani getInstance() {
return instance;
}
public void bark() {
System.out.println("kwakaaaakakakawawak!!!!!!!!!!!!!!");
}
}
OOP의 큰 특징 중 하나.
접근제어지시자로 클래스 외부에서 내부에 접근할 수 있는 정도를 제한할 수 있음
접근하도록 허용된 정해진 방법을 제공. (e.g. 변수에 대한 setter, getter)
// Test.java
package classpart;
public class Test {
public static void main(String[] args) {
Gorani g = new Gorani(53, "wonjin");
System.out.println(g.getId()); // 53
System.out.println(g.getName()); // wonjin
g.setName("LEE WON JIN");
System.out.println(g.getName()); // LEE WON JIN
}
}
// Gorani.java
package classpart;
class Gorani {
private int id; // read-only (getter만 제공)
private String name; // getter, setter모두 제공
protected int changeCnt;
public Gorani(int id, String name){
this.changeCnt = 0;
this.id = id;
this.name = name;
}
private void updateChangeCnt(){
changeCnt++;
}
public int getId(){
return id;
}
public String getName(){
return name;
}
public void setName(String name){
updateChangeCnt();
this.name = name;
}
}