Stack Memory: 함수가 호출될 때 사용하는 메모리로, 함수에서 사용하는 지역 변수, 파라미터 등 연산에 사용되는 임시 값이 생성되는 영역이다. 함수의 기능 수행이 끝나면 자동으로 반환되는 메모리이다.
클래스(Class)
객체(Object)
인스턴스(Instance)
클래스를 객체로 만들어서 메모리에 할당한 것.
인스턴스는 객체에 포함된다고 볼 수 있다.
oop의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 ‘인스턴스’라고 부른다.
/* 클래스 */
public class Animal {
...
}
/* 객체와 인스턴스 */
public class Main {
public static void main(String[] args) {
Animal cat, dog; // 아직 메모리 할당은 안받았으니 그냥 '객체'
// 인스턴스화
cat = new Animal(); // cat은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
dog = new Animal(); // dog은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
}
}
Q. 클래스 VS 객체
Q. 객체 VS 인스턴스
추상화 기법
public Person() {
this("이름없음",1);
// default constructor가 호출되면 name = "이름없음", age = 1 으로 설정
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// this를 이용해 다른 생성자를 호출할 때는 그 이전에 어떠한 statement도 사용할 수 없다
// 위와 같이 생성자가 여러 개이고 파라미터만 다른 경우 constructor overloading이라고 한다.
non-static 멤버
static 멤버
여러 개의 인스턴스가 같은 메모리의 값을 공유하기 위해 사용
공간적 특성: 멤버는 클래스당 하나가 생성된다.
시간적 특성: 클래스 로딩 시(프로그램이 메모리에 로드될 때)에 멤버가 생성된다.
공유의 특성: 동일한 클래스의 모든 객체들에 의해 공유된다.
static 메소드에서는 인스턴스 변수를 쓸 수 없음
https://gmlwjd9405.github.io/2018/08/04/java-static.html
어떤 클래스에 대해 프로그램에서 단 하나의 인스턴스만 생성해야 할 때 사용하는 패턴이다.
// Company 인스턴스가 단 하나여야 하는 경우
public class Company {
// 유일하게 생성되는 인스턴스
private static Company instance = new Company();
private Company() { }
public static Company getInstance(){
if(instance == null)
instance = new Company();
return instance;
}
}
자바에서 배열은 new 생성자를 사용해 선언한다.
Book[] library = new Book[5];
int[][] arr = new int[2][3];
// length = 3 짜리 배열 초기화
int[] numbers = new int[] {0,1,2};
int[] numbers = new int[3] {0,1,2}; //오류남
int[] numbers = {0,1,2};
System.arraycopy(library, 0, librarycopy, 0, 5)
for(String lang:strArray){
System.out.println(lang);
}
기존 배열은 길이를 정하여 선언해야 하고, 중간에 요소를 삭제하거나 삽입하는 것도 어려워서 자바에서는 ArrayList 클래스를 제공한다. 여러 메서드와 속성을 사용해 객체 배열을 편리하게 관리 할 수 있다.
ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.get(0); // A 반환. list[0]은 안됨