٩(๑•̀o•́๑)و

20200301 본문

Java

20200301

11mia 2020. 3. 1. 23:47

 

맴버 변수

  • 객체가 가지는 특성, 속성을 변수로 표현
  • 클래스의 멤버변수
  • =member variable = property = attribute

메서드 : 객체 내부에 구현된 함수. 멤버변수를 이용하여 클래스의 기능을 구현 = member function

함수 호출시 함수에서는 스택메모리를 사용.

처음 스택에는 main이 존재하는 상태. main에서 사용하는 지역변수까지.. 

-> 이때 함수호출(함수1)이 일어나면 main 위로 스택에 쌓임.  

-> 함수1의 매개변수의 값도 main에서 호출된 함수부로 복사가된다. 

-> 함수1에서 리턴이 될 경우 스택에는 main만 남게됨. 리턴됨과 동시에 자동으로 메모리가 반환된다.(pop)

cf) 메소드 내부에서 사용하는 변수는 지역변수.

지역변수는 함수호출과 동시에 스택에 생성이 되었다가 리턴됨과 동시에 메모리에서 사라짐. 주구장창 남아있지 않는다.

 

인스턴스 : 클래스로부터 생성된 객체. 힙메모리에 클래스안의 멤버변수의 크기에 따라 메모리가 생성된다. (클래스는 청사진. 이 클래스로 생성된 객체가 인스턴스)

 

힙메모리 = 동적메모리

 

클래스를 기반으로 new키워드를 이용하여 여러개의 인스턴스를 생성. 

인스턴스는 각각의 멤버변수 값을 갖게되고 이는 힙메모리에 생성된다. 

멤버변수는 new하는 시점에 힙메모리에 생성된다.

Student student = new Student();

라고 할때 student1 자체는 스택에 쌓인다. 사이즈는 어드레스사이즈만큼. 즉 student1은 스택에서 주소를 갖고있는 참조변수. 이때 가리키는 주소(참조값)는 힙메모리에 생성된  멤버변수들의 위치. & 힙메모리에 생성된 멤버변수들을 인스턴스라고한다.

따라서 student1.name 하는식으로 힙메모리의 멤버변수들을 참조하는셈.

new할때마다 힙메모리에 생성되기때문에 인스턴스들은 각자 다른 힙메모리위치에 할당된다.

Student student1 = new Student();
System.out.println(student1);

student1을 출력해보면 패키지명을 포함한 클래스풀네임@주소 형태로 참조변수값을 출력. 이때의 주소는 가상의 jvm이 준 해시코드값. 실제 피지컬한 주소가 아니다. & 16진수로 표현된 주소값. 이로 인해 몇비트인지까지도 알 수 있음.

 

자바는 가비지콜렉터라는 쓰레드가 있어서 쓰지 않는 메모리들을 수거한다. 적절한 타이밍에 한번씩 돌면서 더이상 레퍼런스되지 않는 메모리들을 수거한다.

생성자 constructor

  • 객체를 생성할때만 부를 수 있으며, new 키워드와 함께 호출
  • 인스턴스를 초기화하는 코드가 구현되며 주로 멤버변수를 초기화하는 코드가 들어간다.
  • 반환값은 없음
  • 상속되지 않음
  • 클래스 이름과 동일
  • 매개변수
  • 오버로딩이 가능하다. 매개변수를 달리하여 여러개의 생성자 추가가 가능.

 

기본 생성자(default constructor)

  • 매개변수가 없고 구현부가 없는 생성자 = 기본생성자. public Student (){} 형태
  • 하나의 클래스에는 반드시 하나 이상의 생성자가 존재해야함.
  • 구현하지 않을 시 컴파일러가 기본 생성자를 생성해준다. 
  • 만약 클래스에 다른 생성자가 있을 경우 디폴트 생성자는 제공되지 않음. 따라서 생성자를 구현한 상태에서 클라이언트 코드에서 디폴트 생성자를 사용할 경우에는 오류가 발생한다. 이땐 디폴트 생성자를 직접 클래스에 추가하거나 디폴트생성자 사용부를 수정하면됨.

 

생성자 오버로딩

  • 생성자를 두 개 이상 구현하는 경우
  • 사용하는 코드에서는 여러개의 생성자 중 선택하여 사용할 수 있다.
  • private변수도 생성자를 이용하여 초기화 가능

 

참조 자료형(reference data type)

  • 기본 자료형은 사용하는 메모리가 정해져있지만, 참조 자료형은 클래스에 따라 다름.

 

접근 제어자(access modifier)

  • 변수, 메서드, 생성자에 대한 접근 권한 지정
  • public, private, protected, 아무것도 안쓰는 경우(기본 접근 제어자)
  • private :  클래스 외부에서는 접근불가. 클래스 내부에서만 사용. 정보 은닉 구현이 가능해짐
  • protected : 상위 클래스가 가진 private 변수나 메소드를 하위클래스에 public하게 오픈하고싶을경우 사용
  • 아무것도 사용하지 않을 경우(기본 접근 제어자) : 같은 패키지 내에서만 참조 가능. 패키지가 다를 경우에는 public을 명시해줘야함.
  외부 class 하위 class 동일 패키지 내부 class
public o o o o
protected x o o o
default x x o o
private x x x o

정보 은닉(information hiding)

  • 외부에서 클래스 내부의 정보에 접근하지 못하도록함. private 키워드를 활용.
  • private 변수를 외부에서 접근하게 하려면 public 메서드를 제공하면됨.(getter, setter 등 제공)
  • 클래스 내부 데이터를 잘못 사용하는 오류를 방지할 수 있음.
  • 생성자에도 private를 붙일 수 있음.

 

this의 역할

  • 자신의 메모리를 가리킴
  • 생성자에서 다른 생성자를 호출할 경우 - 상속관계에서 상위 클래스의 생성자를 호출할 경우에는 super를 사용
  • 인스턴스 자신의 주소를 반환할 일이 있을 경우
  • 여러개의 인스턴스가 있을 경우 각각의 인스턴스의 this 값은 다름
public Student(){
        this(1,"홍길동");
    }

    public Student(int StudentId, String name){
        this.StudentId=StudentId;
        this.name=name;
    }

 

생성자에서 다른 생성자 호출

static 변수

  • 여러 인스턴스가 있을때 각 인스턴스의 멤버변수는 힙메모리에 각각 잡힌다.
  • 여러 인스턴스가 하나의 값을 공유할 필요가 있을 경우 사용. 즉 글로벌 변수가 필요.
  • static변수는 데이터 영역(=상수영역, static영역) 메모리에 잡힌다. 단 한번만 메모리에 잡히고 모든 인스턴스가 공유한다.(cf. 인스턴스의 멤버변수가 잡히는 영역은 힙메모리)
  • 처음 프로그램이 로드될 때 데이터 영역에 생성됨. 인스턴스의 생성과 상관없이 사용할 수 있으므로 클래스 이름으로 참조.
  • = 클래스변수 , 정적변수

static 메서드

  • static 변수를 위한 기능을 제공하는 static 메서드
  • static 메서드에서는 인스턴스 변수를 사용하지 않음
  • 클래스 이름으로 참조하여 사용하는 메서드
  • =클래스 메서드 , 정적 메서드
변수 유형 선언 위치 사용 범위 메모리 생성과 소멸
local variable 함수 내부 선언 함수 내부 stack 함수 호출~끝
member variable 클래스 내부 선언

클래스 내부

(private이 아닐 경우 다른 클래스에서 사용 가능)

heap 인스턴스 생성시 힙에 생성, 가비지 컬렉터에 의해 소멸
static variable static 예약어를 사용하여 클래스 내부 선언

클래스 내부

(private이 아닐 경우 다른 클래스에서 사용 가능)

data area 프로그램이 처음 시작될 때 생성. 프로그램이 끝날때 소멸

 

singleton pattern

  • 디자인 패턴 중 하나
  • static을 이용하여 구현 가능
  • 단 하나만 존재하는 인스턴스가 필요할 경우 사용

 

singleton 구현 방법

  • 생성자는 private로 - 외부에서는 호출 불가!
  • static 으로 유일한 객체 생성
  • 외부에서 유일한 객체를 참조할 수 있는 public static get() 메서드 구현

singletone

'Java' 카테고리의 다른 글

20200307 - 인터페이스  (0) 2020.03.07
20200306  (0) 2020.03.06
20200305  (0) 2020.03.06
20200304  (0) 2020.03.05
20200303  (0) 2020.03.03