JAVA 03 : 함수, 클래스/객체 개요, static, 싱글턴 패턴, 정보은닉

LeeWonjin·2022년 7월 13일

2022 백엔드스터디

목록 보기
3/20

인프런 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 클래스는 하나만 존재해야 하고 파일명과 식별자가 같아야 함
    • 모든 코드는 class 블록 내부에 위치.

객체

클래스(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

──────		──────

생성자

수식어 클래스식별자(매개변수){
  수행내용
}
  • 인스턴스를 생성할 때 호출되는 명령어의 모음 (메소드 아님)
  • 상속, 리턴 불가
  • 오버로드 가능

생성자를 아무것도 정의되지 않으면 기본생성자가 자동구현된다.

this 키워드의 역할

  • 인스턴스 자신의 주소 반환 / 참조
  • 생성자에서 오버로딩된 다른 생성자 호출
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키워드를 붙일 수 있음.
이런 멤버는 인스턴스별로 메모리를 할당하는 것이 아니라, 클래스 전체에 걸쳐 공유하는 멤버임.

데이터 영역

코드, 데이터, 스택, 힙 영역
static멤버는 프로그램이 메모리에 적재될 시점에 데이터 영역에 메모리를 할당받음
new키워드로 객체가 생성되는 것과 static멤버가 메모리에 적재되는 것은 관계없음.

Singleton 패턴 (static 응용)

전체 시스템에서 오직 1개의 인스턴스만 존재하도록 구현하는 방식

  • 생성자 : 밖에서 생성할 수 없도록 private지시자 사용
  • 인스턴스 생성 : 클래스 내에서 static으로 1개 생성
  • 인스턴스 접근 : static public의 getter메소드 제공
// 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)

접근제어지시자

  • private : 클래스 내부에서만 접근 가능
  • public : 어디서나 접근 가능
  • 디폴트 지시자 : 같은 패키지 내에서 접근 가능. 아무 지시자도 붙이지 않으면 적용됨.
  • protected : 상속된 클래스에 대해 public처럼, 그 외의 경우에 대해 private처럼 동작

예시

// 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;
    }
}
profile
노는게 제일 좋습니다.

0개의 댓글