본문 바로가기
  • 문과생의 백엔드 개발자 성장기
|Backend.DevLog/JAVA

12. Java - 함수, 메서드 , 인스턴스 , 스택, 힙

by 케리's 2022. 6. 29.

⭕️  변수의 종류

 1) 멤버 변수

  - 클래스 멤버로 선언되는 변수, 메서드 외부에 선언됨

 

  ① 클래스 변수

   - 변수 선언 시 static 키워드가 선언된 메서드

   - 프로그램 시작시 메모리에 개체 생성되어 프로그램 종료시까지 계속 남아있음

 

  ② 인스턴스 변수

  - 클래스로 선언되었지만 static 선언되지 않은 변수

  - 클래스 당 1개만 프로그램 시작 전에 생성됨

  - 해당 인스턴스가 참조되고 있다면 계속 사용 가능

 

 2) 지역 변수

  - 메서드 안에 선언된 변수, 해당 메서드에서만 사용 가능

  - 메서드 실행시 메모리에 생성되어 메서드 종료시 자동 삭제

  - 메서드 내 어디서든 호출 가능. 단, 선언한 다음 사용함

 

출처: https://bsj10k2.tistory.com/23 [사는거 징그럽다...:티스토리]

 

함수란 (function)

  • 하나의 기능을 수행하는 일련의 코드
  • 구현된(정의된) 함수는 호출하여 사용하고 호출된 함수는 기능이 끝나면 제어가 반환됨
  • 함수로 구현된 하나의 기능은 여러 곳에서 동일한 방식으로 호출되어 사용될 수 있음

 

함수 정의하기

함수는 이름, 매개 변수, 반환 값, 함수 몸체(body)로 구성됨

int add(int num1, int num2) {
		
	int result;
	result = num1 + num2;
	return result;
}

 

함수 구현하기 예제

package ch01;

public class FunctionTest {
	
	// 1. 매개변수가 있고 반환값이 있는경우 
	public static int addNum(int num1, int num2) {
		int result;
		result = num1 + num2;
		return result;
	}
	// 2. 반환값이 없는경우 
	public static void sayHello(String greeting) { //return 값 없을때 void 
		System.out.println(greeting);
	}
	// 3. 매개변수가 없 반환값이 있는경우 
	public static int calcSum() {
		
		int sum = 0;
		int i;
		
		for(i = 0; i<=100; i++) {
			sum += i;
		}
		
		return sum;
	}

	public static void main(String[] args) {
		
		int n1 = 10;
		int n2 = 20;
		
		int total = addNum(n1, n2);
		
		sayHello("안녕하세요");
		int num = calcSum();
		
		System.out.println(total);
		System.out.println(num);
	}

 

 

함수 호출과 스택 메모리

  • 스택 : 함수가 호출될 때 지역 변수들이 사용하는 메모리
  • 함수의 수행이 끝나면 자동으로 반환 되는 메모리

 

 

메서드 (method)

  • 객체의 기능을 구현하기 위해 클래스 내부에 구현되는 함수
  • 멤버 함수 (member function)이라고도 함
  • 메서드를 구현함으로써 객체의 기능이 구현 됨
  • 메서드의 이름은 그 객체를 사용하는 객체(클라이언트)에 맞게 짓는것이 좋음
  • 예) getStudentName()

 

 

객체의 속성은 멤버 변수로, 객체의 기능은 메서드로 구현한다

 

학생 클래스를 정의 하고 이를 사용해 보자

  • 학생 클래스의 속성을 멤버 변수로 선언하고 메서드를 구현한다
package ch02;

public class Student {
	
	//멤버변수 생성 
	public int studentID;
	public String studentName;  
	public String address;
	
	// 메서드 생성 
	public void showStudentInfo() {
		System.out.println(studentID + "," + studentName + "," + address);
	}
	
	public String getStudentName() {
		return studentName;
	}
	
	public void setStudentName(String name) {
		studentName = name;
		
	}

}

 

 

  • 학생 클래스를 생성하여 생성된 객체(인스턴스)에 각각 다른 이름과 주소를 대입한다 - 실행부
package ch02;

public class StudentTest {
	
public static void main(String[] args) {
		
		Student studentLee = new Student(); //인스턴스 생성 
		// 각각 다른이름으로 줄 수 있는 이유는 heap이라는 동적메모리에 할당 되기 때문이다. 
		
		//참조변수 
		studentLee.studentID = 12345;
		studentLee.studentName = "이순신";
		studentLee.address = "서울";
		
		
		studentLee.showStudentInfo(); // 메서드실행 
		
		Student studentKim = new Student();
		
		studentKim.studentID = 56789;
		studentKim.setStudentName("김유신");
		studentKim.address = "경주";
		
		studentKim.showStudentInfo();
		
		//heap 메모리 할당된 주소 
		System.out.println(studentLee);
		System.out.println(studentKim);
	}

}

--------------------------------------------------------------
12345,이순신,서울
56789,김유신,경주
ch02.Student@1517365b
ch02.Student@4fccd51b

 

 

인스턴스 생성과 힙 메모리 (heap memory)

 

인스턴스 (instance)

  • 클래스는 객체의 속성을 정의 하고, 기능을 구현하여 만들어 놓은 코드 상태
  • 실제 클래스 기반으로 생성된 객체(인스턴스)는 각각 다른 멤버 변수 값을 가지게 됨
  • 가령, 학생의 클래스에서 생성된 각각의 인스턴스는 각각 다른 이름, 학번, 학년등의 값을 가지게 됨
  • new 키워드를 사용하여 인스턴스 생성
  • ex ) 클래스명 참조변수명 = new 클래스명();

 

힙 메모리

  • 생성된 인스턴스는 동적 메모리(heap memory) 에 할당됨
  • C나 C++ 언어에서는 사용한 동적 메모리를 프로그래머가 해제 시켜야 함 ( free() 난 delete 이용)
  • 자바에서 Gabage Collector 가 주기 적으로 사용하지 않늠 메모리를 수거
  • 하나의 클래스로 부터 여러개의 인스턴스가 생성되고 각각 다른 메모리 주소를 가지게 됨

참조 변수, 참조 값

  Student studentLee = new Student();
  studentLee.studentName = "홍길동";

  System.out.println(studentLee);

용어 정리

    객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스

    클래스 : 객체를 프로그래밍 하기위해 코드로 정의해 놓은 상태

    인스턴스 : new 키워드를 사용하여 클래스를 메모리에 생성한 상태

    멤버 변수 : 클래스의 속성, 특성

    메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현한 함수

    참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수

    참조 값 : 생성된 인스턴스의 메모리 주소 값

 

댓글