728x90
Memory

 
1. 메소드 영역

클래스 데이터 (클래스 변수)


프로그램 실행 중 어떤 클래스가 사용되면,

JVM은 해당 클래스 파일을 읽어서 클래스 데이터를 이곳에 저장하며 동시에 클래스 변수도 이곳에 생성

2. 호출스택

메인 메소드(지역 변수)

 

메소드 작업에 필요한 메모리 공간을 제공


메소드가 호출되면 호출스택에 메소드 활용을 위한 메모리가 할당된다.
메모리에서 메소드가 작업을 하는 동안 지역변수와 연산의 중간 결과가 저장된다.


메소드가 작업을 마치면 할당된 메모리 공간은 반환되어 비워진다.
호출스택은 제일 상위에 있는 메소드가 지금 실행 중인 메소드 이다.

아래에 있는 메소드가 바로 위에 있는 메소드를 호출해서 사용중인 메소드 이다.

나머지는 모두 대기중

3. 힙 영역

인스턴스(인스턴스 변수)


인스턴스가 이곳에 생성된다.

 

ex)

public class memory {
	public static void main(String[] args) {
		System.out.println("메인 메소드 시작");
		
		first();
		System.out.println("메인 메소드 끝");
	}

	public static void first() {
		System.out.println("first 메소드 시작입니다.");

		second();		//세컨드 호출
		System.out.println("first 메소드 종료입니다.");
	}
	
	public static void second() {
		System.out.println("second 시작입니다.");
		System.out.println("second 끝 입니다.");
	}
}

[실행결과]

메인 메소드 시작
first 메소드 시작입니다.
second 시작입니다.
second 끝 입니다.
first 메소드 종료입니다.
메인 메소드 끝

'JAVA' 카테고리의 다른 글

제네릭 (Generic)  (0) 2021.07.20
랩퍼 (Wrapper)  (0) 2021.07.19
Enum  (0) 2021.07.19
다형성 (Polymorphism)  (0) 2021.07.19
추상화 (Abstract)  (0) 2021.07.19
728x90
Enum : 열거타입

 

Enum은 String과 같이 클래스처럼 보이는 자료형이다. 

 

보통 서로 관련 있는 상수들을 모아 심볼릭한 명칭의 집합으로 정의하는 용도로 사용한다.

자료형 키워드 위치에 'Enum'을 적어 선언한다.

 

ex)

public Enum 클래스이름{
	...
}

 


예제 1.

<Season>

  • Season에는 Spring, Summer, Fall, Winter 라는 상수가 있다. 
  • String 처럼 "Spring"과 같이 바로 대입하면 안되고, Season.Spring 과 같이 표현하여야 한다. 

 

 

package enum;

public enum Season {
	Spring,
	Summer,
	Fall,
	Winter
}

 

package enum;

public class Enum {
	Season season;
	
	public void seasonInfo() {
		//this.season = "Spring";
		this.season = Season.Spring;
	}
	
	public void seasonShow() {
		System.out.println("계절은" + season);
	}
	
	public static void main(String[] args) {
		EnumTest enumTest = new EnumTest();
		enumTest.seasonInfo();
		enumTest.seasonShow();
	}
}

[실행결과]

계절은Spring

'JAVA' 카테고리의 다른 글

랩퍼 (Wrapper)  (0) 2021.07.19
메모리 (Memory)  (0) 2021.07.19
다형성 (Polymorphism)  (0) 2021.07.19
추상화 (Abstract)  (0) 2021.07.19
인터페이스 (interface)  (0) 2021.07.19
728x90
Polymorphism (다형성) : 다양한 형태의 성질

 

같은 타입이지만 실행결과가 다양한 객체를 이용할 수 있는 성질


코드 측면에서 보면 다형성은 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해준다.
다형성을 위해 자바는 부모 클래스로 타입 변환을 허용해준다.
즉 부모타입에 모든 자식객체가 대입될 수 있고, 이것을 이용하면 객체는 부품화가 가능합니다.

 

※ 다형성은 동적 바인딩(런타임 때 최종 타입이 결정되는 것)이 지원되어야 한다.

 


예제 1. 어벤져스

  • Hero 클래스를 상속받은 Ironman, Hulk, Spiderman, Thor클래스가 각각의 위치(하늘, 땅, 바다, 우주)를 담은 변수를 갖고, 각기 다른 공격방식(Javis, 주먹, 거미줄, 번개)을 갖도록 하였다.
package polymorphism;

class Hero{
	public String name;
	public void attack() {
		System.out.println("공격");
	}
}

class Ironman extends Hero{
	public String spot = "하늘";
	int suitCount;
	
	public void makeSuit() {
		System.out.println("Javis, 슈트 만들어줘.");
	}
	
	@Override
	public void attack() {
		System.out.println("javis, 공격");
	}
}
class Hulk extends Hero{
	public String spot = "땅";
	@Override
	public void attack() {
		System.out.println("주먹");
	}
}
class Spiderman extends Hero{
	public String spot = "바다";
	@Override
	public void attack() {
		System.out.println("거미줄");
	}
}
class Thor extends Hero{
	public String spot = "우주";
	@Override
	public void attack() {
		System.out.println("번개");
	}
}

public class Polymorphism {
	public static void main(String[] args) {

		Hero h1;		//컴파일타임
		h1 = new Ironman();	//런타임
		
		Hero[] avengers = new Hero[4];
		
		avengers[0] = new Ironman();
		avengers[1] = new Hulk();
		avengers[2] = new Spiderman();
		avengers[3] = new Thor();
				
		for (Hero hero : avengers) {
			hero.attack();
		}
		
		for (int i = 0; i < avengers.length; i++) {
			avengers[i].attack();
		}
		
	}
}

[실행결과]

javis, 공격
Javis, 슈트 만들어줘.
Javis, 슈트 만들어줘.
javis, 공격
주먹
거미줄
번개
javis, 공격
주먹
거미줄
번개

 

※ 컴파일타임, 런타임

Hero h1;		//컴파일타임
h1 = new Ironman();	//런타임

 

※ 자식 객체는 부모 클래스로의 타입 변환을 허용한다.

즉, 부모 객체에 자식 객체를 대입하여 부모 클래스로 타입 변환하는 것은 가능하다. (결과 : 부모)
그러나 자식 객체에 부모 객체를 대입하는 것은 불가능하다. 

Hero h = new Ironman(); //가능 
Ironman i = new Hero(); //불가능

 

※ 자식 클래스에서 정의한 멤버나 메소드 사용하기

  • 방법1) 형변환
    //방법1 형변환
    ((Ironman)h1).makeSuit(); //Javis, 슈트 만들어줘.
    ((Ironman)h1).suitCount = 10; //Javis, 슈트 만들어줘.​
  • 방법2) 새 객체 생성
    //방법2 새 객체 생성 
    Ironman i2 = (Ironman)h1;
    i2.makeSuit();​

 

예제 2. 어벤져스2

  • 위치에 따라 다른 Hero를 부를 수 있도록 Hero 클래스에 callHero 메소드를 만든다. 
package polymorphism;

public class Polymorphism02 {
	public static Hero callHero(String spot) {
		
		if(spot.equals("하늘")) {
			return new Ironman();
		}else if(spot.equals("땅")) {
			return new Hulk();
		}else if(spot.equals("바다")) {
			return new Spiderman();
		}else {
			return new Thor();
		}
		
	}
	
	public static void main(String[] args) {
		
		Hero h1 = callHero("바다"); //바다에 해당하는 영웅은 스파이더맨 
		Hero h2 = callHero("땅"); //땅에 해당하는 영웅은 헐크
		
		h1.attack(); //거미줄 //스파이더맨의 공격은 "거미줄" 이므로
		h2.attack(); //주먹 //헐크의 공격은 "주먹" 이므로
		
	}
}

[실행결과]

거미줄
주먹

 

※ 참고

Hero 클래스의 callHero 메소드를 선언할 때, Hero 클래스에 직접 가서 callHero 메소드를 정의하지 않고

다음과 같이 Polymorphism02 클래스 안에서 외부 클래스인 Hero 클래스의 callHero 메소드를 선언했다. 

package polymorphism;

public class Polymorphism02 {
	public static 외부클래스 메소드이름(파라미터) {
		
		...
		
	}
}

어벤져스2 에서는 아래와 같이 사용 되었다. 

package polymorphism;

public class Polymorphism02 {
	public static Hero callHero(String spot) {
		
		...
		
	}
	
	public static void main(String[] args) {
		
		...
		
	}
}

'JAVA' 카테고리의 다른 글

메모리 (Memory)  (0) 2021.07.19
Enum  (0) 2021.07.19
추상화 (Abstract)  (0) 2021.07.19
인터페이스 (interface)  (0) 2021.07.19
StringBuffer와 StringBuilder  (0) 2021.07.19
728x90
Abstract (추상 클래스)

 

현실화 되어질 필요가 없는, 상속될 것을 전제로 한클래스

 

클래스를 만드는 목적은 인스턴스 생성하기 위해서이지만, 추상클래스는 인스턴스를 생성할 수 없다.

인스턴스화 할 필요는 없지만 상속개념에서 중요한 위치를 가지는 클래스를 보통 추상 클래스로 선언하여 사용한다.


추상 클래스 선언 규칙  

 

  1. 클래스의 정의된 메소드 중 추상 메소드가 하나라도 있다면 해당 클래스는 무조건 추상 클래스가 된다.
     
  2. 만약 추상 메소드가 하나도 없을 때 클래스를 추상화 하고 싶다면
    abstract라는 키워드를 붙여서 추상화 시킬 수 있다.

  3. abstact라는 키워드를 리턴 타입 앞에 선언한다.

  4. 추상 메소드는 메소드 바디가 없는 형태{ }이므로 파라미터 괄호( )뒤에 세미콜론;을 붙여준다.
    ex) public abstract void print();
     
  5. 추상 클래스는 자신의 인스턴스를 발생시킬 수 없지만 생성자, 메소드, 필드는 모두 선언/정의 할 수 있다.
    또한 super type 전개 가능하므로 다형성(다양한 형태)도 적용가능하다.
     

'JAVA' 카테고리의 다른 글

Enum  (0) 2021.07.19
다형성 (Polymorphism)  (0) 2021.07.19
인터페이스 (interface)  (0) 2021.07.19
StringBuffer와 StringBuilder  (0) 2021.07.19
오브젝트 (Object)  (0) 2021.07.19

+ Recent posts