반응형
SMALL
[1] 인스턴스 instance
(1) 인스턴스 정의
- 클래스 기반으로 생성된 객체
- 각각 다른 멤버 변수 값을 가지게 된다
- new 를 사용하여 인스턴스를 생성한다
- new 키워드를 사용하여 클래스를 메모리에 생성한 상태
- 클래스를 기반으로 만들어진 객체 , 클래스로부터 객체를 선언한다 (인스턴스화 한다)
- 인스턴스화 : 클래스로부터 객체를 만드는 과정
- 인스턴스 : 클래스로부터 만들어진 객체
- 인스턴스는 객체와 같은 의미지만 , 객체는 포괄적인 의미이고 인스턴스는 어떤 클래스로부터 만들어진 것이 중점인 의미
- 인스턴스는 참조변수를 통해서만 다룰수 있고 , 참조변수의 타입은 인스턴스의 타입과 일치해야한다
- 실행시 호출되어야하는 메서드를 찾는 과정이 있어 시간이 소요된다
1. 인스턴스1
Student studentA = new Student();
studentA.studentName = "김철수";
studentA.address = "서울";
2. 인스턴스2
Student studentA ; //참조변수
studentA = new Student();
(2) 인스턴스와 힙메모리
- 인스턴스를 생성하면 stack 메모리에서 heap메모리에 할당하여 사용할 준비를 한다
- 인스턴스가 계속 미사용되면 메모리 절약을 위해 java gabage collector가 주기적으로 메모리를 수거한다
- 각각 인스턴스는 다른 메모리 주소를 가지게 된다
(3) 참조변수와 인스턴스
참조변수 : 메모리에 생성된 인스턴스를 가리키는 변수
참조 값 : 생성된 인스턴스의 메모리 주소 값
(4) 인스턴스 사용방법
class test1 { ------------> 클래스 1번
// test1 () {} 생성자_생략
String name;
public void classTest () {
System.out.println("name");
}
}
class test2 { --------------> 클래스 2번
// test2 () {} 생성자_생략
String name;
public void classTest() {
System.out.println("name");
}
}
public class Main { ------------> java 메인함수
public static void main(String[] args) { ---> 메인 메소드 불러오기
test1 testName1 = new test1(); ----> 클래스 1의 객체 인스턴스화 불러오기
test2 testName2 = new test2(); -----> 클래스 2의 객체 인스턴스화 불러오기
testName1.name = "김"; ----> 클래스1의 함수에 값을 "김"으로 넣어라
testName2.name = "Area"; ----> 클래스2의 함수에 값을 "Area"으로 넣어라
test1.classTest() -----> 클래스1의 classTest 함수에 출력하라고 기재되어있어서 "김"출력함
test2.classTest() ----> 클래스2의 classTest 함수에 출력하라고 기재되어있어서 "Area"출력함
}
}
(5) 인스턴스 메서드
반드시 인스턴스 객체를 생성해야만 인스턴스 메서드를 호출할수 있다
인스턴스 변수 , 인스턴스 생성, 인스턴스 메서드 세트로 사용한다
[2] static 클래스변수
(1) 클래스 변수 = 정적변수
- static 이 있는 변수
- 클래스가 메모리에 올라갈때 자동적으로 생성된다
- 예)학생이 들어올때마다 학번이 생성되어야한다. 공통된 속성
- 예)카드를 새로 발급할때마다 새로운 카드번호가 부여되어야한다.공통된 속성
- 예)사원이 입사할때마다 새로운 사번을 부여해야한다.공통된 속성
(2) 클래스변수를 사용해야할때
- 멤버변수 중에서 인스턴스 생성시 공통으로 사용해야할 속성(멤버변수)에 static을 붙인다
- 인스턴스 생성하지 않아도 클래스이름으로 호출하여 사용할수 있다
- 인스턴스 변수 사용을 못하므로 인스턴스 변수, 인스턴스 메서드 사용이 필요없을때 사용한다
(3) static & heap 메모리
static 메모리 영역
: 클래스 , 변수, 메소드 존재한다 , GC 관리영역에 포함되지 않는다
: 객체를 생성하지 않고도 접근이 가능하고 여러 객체들이 공유한다
: 프로그램 실행 내내 메모리가 할당된 채 존재한다
class test {
static String name = "none" -----> name은 static메모리 영역에 있다
public void classTest(String name, String type) {
System.out.println("name");
System.out.println("type");
}
}
public class Main {
public static void main(String[] args) {
test name = new test(name a, type 가); ---> 클래스는 name은 a, type 은 가 선언하다
test name = new test(name b, type 나); ---> 클래스는 name은 b, type 은 나 선언하다
test name = new test(name c, type 다); ---> 클래스는 name은 c, type 은 다 선언하다
test.classTest(); ---> 마지막에 있는 c ,다만 출력된다 객체 공유가 되기 떄문에
heap영역
: 객체 존재한다 , GC관리영역에 포함된다
: new 연산자에 의해서 생성된 객체들이 존재하는 메모리 영역이다
:연산시에만 메모리에 할당되고 역할이 끝나면 바로 메모리 삭제
(4) 클래스 메서드
- static이 붙어있는 메서드
- 객체를 생성하지 않아도 "클래스이름.메서드이름" 으로 호출이 가능하다
- 클래스 메서드에 매개변수로만 만들어져 매개변수만 있다면 객체를 생성하지 않아도 호출이 가능하다
- 인스턴스변수나 인스턴스 메서드를 사용하지 않는 메서드를 클래스 메서드로 정의한다
- 클래스 메서드 내에 인스턴스 변수나 인스턴스 메서드를 호출할수 없다
(5) static 변수 사용하기
- 사원이 생길때마다 시리얼넘버 = 사원아이디가 증가해야한다
- 멤버변수 : 사원아이디, 사원이름, 부서
public class Employee {
//사원이 생길때마다 증가해야하는 변수
private static int serialNum = 1000;
//멤버변수, 개인정보
private int employeeId;
private String employeeName;
private String department;
//인스턴스 될때마다 자동으로 추가되는 생성자
public Employee() {
serialNum++;
employeeId = serialNum;
}
//캡슐화
public static int getSerialNum() {
return serialNum;
}
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
- 본main함수에서 인스턴스를 생성할때마다 시리얼넘버가 생성되도록 serialNum++한다
- 이름같은 다른 정보는 아래처럼 각각 넣어야하지만 시리얼넘버는 별도로 입력하지 않았다.
public class Service {
public static void main(String[] args) {
//인스턴스1
Employee employeeA = new Employee();
employeeA.setEmployeeName("김철수");
//인스턴스2
Employee employeeB = new Employee();
employeeB.setEmployeeName("이영희");
//정보출력
System.out.println(employeeA.getEmployeeName()
+ "님의 사번은 "+ employeeA.getEmployeeId() ); //1001
System.out.println(employeeB.getEmployeeName()
+ "님의 사번은 "+ employeeB.getEmployeeId() ); //1002
}
}
반응형
LIST
'🌈 백엔드 > 객체 지향' 카테고리의 다른 글
JAVA_객체지향_접근제어 지시자 & 캡슐화 (0) | 2023.06.03 |
---|---|
JAVA_객체지향_생성자 (0) | 2023.06.03 |
JAVA_객체지향_함수 & 메서드 (0) | 2023.06.03 |
JAVA_객체지향_프로그래밍 (0) | 2023.06.03 |
JAVA_객체지향_ 예외 클래스 (0) | 2023.02.16 |