클래스&OOP, 메모리

ming·2023년 5월 27일
0

자바 기초

목록 보기
3/12
  • 메모리
    1.힙(heap)
    - 인스턴스변수와 객체가 저장됨. (정확한 표현으로 인스턴스는 객체의 내부에 존재함.)
    객체 생성에 의해 힙에 생성된 객체를 인스턴스라고 한다.
    클래스내의 구성요소(인스턴스 변수, 메소드)가 저장된다.
    - 수명- 레퍼런스가 객체의 참조를 소실할 경우 가비지 컬렉터에 의해 객체는 소멸됨(인스턴스와 함께).


    2.스택(stack)
    - 매서드 내에서 선언되는 로컬변수, 메서드와 매개변수가 저장됨.
    - 서로 블록이 다른 로컬변수는 생성 및 제시기가 다르기 때문에 사용가능.
    - 수명- 블럭{} 내부에서만 존재함.
    - LIFO(후입선출: 가장 나중에 들어온 변수가 가장 먼저 소멸)


    3.스테틱(static)
    - static 영역은 정적이다. 프로그램 터음부터 끝까지 살아있다.
    - 메모리가 제일 적다.

    1→3으로 갈수록 정적이다.

  • 클래스 & OOP

    자원의 재활용이 가장 중요한 목적이다.
    사람을 흉내냄.

    클래스를 설계도에 비유할 수 있다. → 설계도를 통해 제품을 생산한다. 만들어진 제품은 object, instance라고 한다. 메모리를 가진다.

    클래스를 만드는 것은 새로운 타입을 만드는 것과 같다.
    물건(펜)을 설계도로 그려본다면, 물건을 만들기 위한 구체적인 속성(특성)은 잉크 색, 펜의 모양 등이 있을 것이고, 물건의 행위에는 펜촉보이기, 숨기기 등이 있을 것이다. 이렇게 볼펜형이 만들어졌다. 클래스 볼펜형의 구성요소(특성, 행위)를 멤버라고 부른다.

    OOP는 조립식 프로그램이다. 여러개의 클래스를 모아서 완성한다.
    자바에서는 모든 게 객체인데 이걸 갖다 쓰기 위해, 내가 타입을 만들기 위해 공부한다.

  • 클래스를 묶은 것을 라이브러리라고 하고, 더 큰 개념을 frame work라고 한다.

  • 오버로딩 기법은 OOP 주요 특징인 재사용성을 활용하는 방법이다.

  • 서로 다른 이름으로 된 메소드를 사용하기 보다는 동일 이름으로 사용하는 것이 관리, 사용하기에 편하다.

package pack2;
//230102(1)
//method overloading(재명명): 하나의 클래스에 동일한 이름의 메소드를 복수로 작성
// + 클래스의 구성요소 & 사용

//클래스: 자바에서는 모든 객체가 클래스로 지정되어지며 가장 작은 실행단위이다. 
// 자바는 OOP언어로서 클래스를 통해서 데이터를 처리하는 것이다. 
// 따라서 클래스의 구성요소는 데이터를 효율적으로 처리(저장,수정,삭제,조회)위한 용도로서 사용된다. 
public class Animal {
	// 클래스의 3가지 구성요소
	// 1. 인스턴스 변수 : 클래스가 처리할 데이터를 저장하는 용도, 멤버변수라고도 함
	// 객체 생성시에 힙에 생성
	private int leg=4;
	private int age;
	private double weight;
	private String name;
	private int eye=2;
	public final static int MOUTH=1;//모든 동물 입은 하나
	// final - 자바에서는 변경되는 것이 마지막이라는 용도로 사용. 값 변경이 불가능한 상수. 대문자로 표현.

	
	//3. 생성자 : 인스턴스 변수를 초기화하는 역할 
	// 의미: 객체가 만들어지는 것과 동시에 구현해야 할 것들을 미리 정의, 구현할 경우. (ex. 통장을 만듦과 동시에 계좌번호 생성.)
	// 생성자의 한정자는 제한 없음(public-기본임, private- 굳이 인스턴스를 만들지 않을 경우.....)
	/* (스택에 쌓이는 순서는 반대 : 상위 클래스의 생성자가 제일 위에 오며,  메모리 점유는 레퍼런스가 필요한 만큼 자동 설정됨.^^)
	 * 객체가 제 모양을 갖추려면 그 객체의 상위 클래스 부분도 제 모양을 갖춰야 하는데, 바로 그런 이유로 인해 상위 클래스의 생성자도 실행되어야 함.
	 **/
	// 메소드처럼 호출되어야 수행된다. 
	public Animal() {
		// 객체 생성시 에러발생을 최소화하기 위해 명시적으로 설정
		// 컴파일러가 자동으로 기본생성자를 생성할 경우 기본생성자의 접근지정자는 클래스 선언시의 접근지정자를 따름
	}
	/* 기본 생성자(인자없는)는 구현하지 않아도 컴파일러가 자동으로 생성함.
	 * 인자가 있는 생성자를 구현할 경우 기본 생성자도 함께 구현해야 함.
	 * (이 경우 컴파일러가 자동으로 생성하지 않음. 만약 기본 생성자를 쓰지 않는 다면 생략해도 됨..)
	 * */
	
	//생성자 오버로딩-----------------------------
	public Animal(int leg) {
		this.leg=leg;
	}
	public Animal(String name) {
		this.name=name;
	}
	public Animal(String name,int age) {
		this.name=name;
		this.age=age;
	}
	
	//메소드 오버로딩-----------------------------
	// 2. 메서드 : 인스턴스 변수에 저장된 속성값을 수정하거나 조회 또는 다양한 기능 처리 및 중복처리 담당 역할이며 멤버메서드라고도 함
	// 클래스를 인스턴스할 떄마다 매번 생성되지는 않고 공유해서 사용된다. 모든 인스턴스의 메소드가 동일한 코드로 작성되었기 때문.
	// 일반적으로 소문자인 동사형태로 지정
	// 지정자는 일반, 접근 지정자 모두 사용, 일반적으로 public 사용
	public void display() {
		System.out.println("leg:"+leg+", age: "+age+", name: "+name+", weight"+weight);
	}
	
	//worker 메소드: caller메소드에 의해 호출되어 실제 작업을 수행하는 메소드. 일반적으로 메소드라고 하면 worker 메소드를 의미. 
	// 메소드를 호출하면 프로그램 제어가 호출한 곳에서 호출된 곳으로 넘어가고 호출된 곳의 작업이 모두 끝나면 반드시 호출한 곳으로 제어가 복귀된다. 
	public void display(int age) { //메소드 오버로딩
		// 결과값 없이 복귀할 때는 반드시 리턴타입에 void를 명시해야 한다. 
		// 매개변수 : 메소드 호출시 전달되는 인자값을 저장하는 변수
		// 매개변수 같으면 응용프로그램에서 호출했을 때 mapping이 된다. 
		// 이름은 같아도 매개변수 개수가 다르면 오버로딩이 성립함.
		this.age=age;
		System.out.println("leg:"+leg+", age: "+age+", name: "+name+", weight"+weight);
	}
	
	public void display(double weight) { //메소드 오버로딩
		//파라미터 개수가 다르거나 타입이 다르면 오버로딩 성립.
		System.out.println("leg:"+leg+", age: "+age+", name: "+name+", weight"+weight);
		//메소드의 전역변수 weight가 출력될 뿐이다.
	}//메이커에서 만든 오버로딩도 많음.
	
	public void display(String irum) { //String값 하나 넣는다는 의미, 변수명과 상관 없음
		name=irum; //매서드 안에서 생성한 변수를 로컬변수라고 한다.
		//로컬변수는 반드시 사용 전에 초기화해야 한다. 
		System.out.println("leg:"+leg+", age: "+age+", name: "+name+", weight"+weight);
	}
	
	
	public void display(String name, int age) { //String 하나, int 하나 준다는 얘기
		this.name=name;
		this.age=age;
		System.out.println("leg:"+leg+", age: "+age+", name: "+name+", weight"+weight);
	}
	//순서가 달라도 오버로딩 성립
	public void display(int age,String name) {
		this.name=name;
		this.age=age;
		System.out.println("leg:"+leg+", age: "+age+", name: "+name+", weight"+weight);
	}
	
	/*public void display(int eye) {//error 오버로딩 실패(타입이 달라야 한다) 
	 *  //argument int타입이 어디 메소드로 가야하는지 구분할 수 없다.
		this.eye=eye;
		System.out.println("leg:"+leg+", age: "+age+", name: "+name+", weight"+weight);
	}*/
	
	/*public int display(int age,String name) { //메소드 오버로딩은 반환과 아무 상관없다(접근지정자도). 매개변수로만 결정된다. 
		this.name=name;
		this.age=age;
		System.out.println("leg:"+leg+", age: "+age+", name: "+name+", weight"+weight);
		return 10;
	}*/
}
package pack2;
//230102(1)

public class AnimalMain {

	public static void main(String[] args) {
		System.out.println("메소드 오버로딩 연습---------");

		Animal tiger = new Animal(); //객체가 할당되기 전 생성자가 우선 호출됨(기본사항)
		// Animal 레퍼런스 타입 선언. "()"의 생성자 호출. "=" 할당. 순으로 객체 생성..
		//메모리에 Animal 클래스의 인스턴스 변수, 메소드가 생성되며 생성위치는 tiger 참조형 변수에 저장한다.
		
		// caller 메소드: 특정동작을 호출하는 메소드 
		// 호출할 때 인자리스트가 다르면 에러. 인자리스트 : 개수, 데이터 타입, 인자의 순서
		// ...(3개의 점)을 사용하는 가변인자를 사용하면 인자의 개수가 달라도 호출할 수 있다. 
		tiger.display();//leg:4, age: 0, name: null  매개변수 없으면 없는 메소드를 찾아감
		tiger.display(3);//leg:4, age: 3, name: null  매개변수 정수를 받는 메소드를 찾아감
		tiger.display(53.1);
		tiger.display("호랑이");
	
		tiger.display("호돌이",10);
		tiger.display(3,"호순이");
		//지역변수와 전역변수의 차이점 알기!
		//파라미터 타입, 개수, 순서가 다르면 다른 메소드
		tiger.display();
		
		System.out.println("생성자 오버로딩 연습---------");
		// 인스턴스 변수는 자동으로 기본값이 저장된다.
		Animal hen= new Animal(2);
		hen.display();
		
		Animal wolfdog = new Animal("늑대");
		wolfdog.display();
		
		Animal fox=new Animal("여우", 2);
		fox.display();
		
		System.out.println();
		System.out.println(fox.MOUTH);
		System.out.println(tiger.MOUTH);//fox,tiger 안가리고 하나여서 이렇게 쓰지 말라고 커맨드
		System.out.println(Animal.MOUTH);
	}
	// 메인 메소드가 종료되면 로컬변수가 사라지고 인스턴스는 참조하는 변수가 없기 때문에 GC에 의해 자동으로 제거된다. 

}

0개의 댓글