본문 바로가기
웹 프로그래밍 기초/자바기반의 웹&앱 응용SW 개발자

자바기반의 웹&앱 응용 SW개발자 양성과정 11일차 -22

by oncerun 2020. 3. 11.
반응형

1. 객체의 생성과 메모리 할당.

 

● 정적 메모리 할당

정적 메모리 할당은 메모리 할당 방법 중에 하나로, 메모리의 크기가 하드 코딩되어 있기 때문에 프로그램이 실행될 때 이미 해당 메모리의 크기가 결정되는 것이 특징이다.

 

프로그램을 실행시키면 Instruction이 우선적으로 main함수로 이동한 뒤 필요한 연산자와 "new" (클래스 타입의 인스턴스(객체)를 생성해주는 역할) 연산자를 이동하면서

정적 메모리로 할당할 변수와 객체들을 Stack영역에 메모리를 할당한다.

 

동적 메모리 할당 또는 메모리 동적 할당

컴퓨터 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말한다. 사용이 끝나면 운영체제가 쓸 수 있도록 반납하고 다음에 요구가 오면 재 할당을 받을 수 있다. 

 

프로그램 실행 중에  참조 객체를 만나게 되면 메서드, 클래스의 멤버 변수를 찾아서

메모리에 동적할당시켜야하는데 Stack구간은 정적 할당 영역이으므로 Heap영역에 메모리를 할당한다.

만약 heap영역의 있는 변수를 어떠한 객체도 참조하지 않고 프래그램이 종료된다면

메모리 누수가 발생하는데 Java에서는 Garbage Collection가 참조하지 않는 객체를 회수한다.

 

사진 1

 

 

2.Java에서 구조적인 관점에서의 함수

1. 함수는 왜필요할까?

 

함수를 이용한 lotto 프로그램.

 

import java.util.Random;

public class lotto {

   public static void main(String[] args) {
      
      Random rand = new Random();
      int[] lotto = new int[6];
      
      // 로또 번호를 생성하고
      createLotto(lotto, rand);
    
      // 로또 번호의 중복을 제거
      deduplLotto(lotto,rand);
  	
  	// 번호를 오름차순으로정렬해서
  	sortLotto(lotto);
  	
    // 로또 번호를 출력한다.      
    printLotto(lotto);
   }//main

public static void deduplLotto(int[] lotto, Random rand) {
	for (int i = 0; i < 6; i++) {
		lotto[i] = rand.nextInt(45) + 1;
		for (int j = 0; j < i; j++) {// 로또 번호 중복제거
			if (lotto[i] == lotto[j]) {
				i--;
			}
		}
	}	
}

public static void createLotto(int[] lotto, Random rand) {
	  for(int i=0; i<6; i++)
	         lotto[i] = rand.nextInt(45)+1;	
}

public static void sortLotto(int[] lotto) {
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5-i; j++) {
			if (lotto[j] > lotto[j+1]) {
				int temp = lotto[j+1];
				lotto[j+1] = lotto[j];
				lotto[j] = temp;
			}
		}
	}
}

public static void printLotto(int[] lotto) {
	 for(int i=0; i<6; i++)
         System.out.printf("%d ", lotto[i]);
      
      System.out.println();
}

}

 

함수를 이용하지 않은 lotto 프로그램.

public class Ex12LottoProgram {

	public static void main(String[] args) {
		
		Random rend = new Random();
		int[] lotto = new int[6];
		
			// 로또 번호를 생성
		for (int i = 0; i < 6; i++) {
			lotto[i] = rend.nextInt(45) + 1;
			// 로또 번호 중복제거
			for (int j = 0; j < i; j++) {
				if (lotto[i] == lotto[j]) {
					i--;
				}
			}
		}
//앞에있는 배열값이클때 위치를바꿔라.
		for (int i = 0; i < 5; i++) {
			for (int j = 0; j < 5-i; j++) {
				if (lotto[j] > lotto[j+1]) {
					int temp = lotto[j+1];
					lotto[j+1] = lotto[j];
					lotto[j] = temp;
				}
			}
		}
		// 로또 번호를 출력
		for (int i = 0; i < 6; i++)
			System.out.printf("%d ", lotto[i]);

		System.out.println();
		}
	}

 

무엇이 더 보기가 좋을까? 나는 함수를 이용한 코드가 한눈에 들어오는 가시성이 더 뛰어나다고 생각된다.

그것뿐일까? 그것뿐이어서 코드를 더 작성해서 깔끔하게 하는 것뿐이라면 함수는 선택사항일 것이다.

 

2. 함수의 기능

1) 코드의 가독성

만약 기능을 사용하는 코드를 여러 번 사용하려고 한다면 2번째 코드에서는 코드량이 점점 더 늘어날 것입니다.

함수를 사용한다면? 반복문을 붙여주는 것만으로  코드의 가독성이 올라갈 것입니다.

 

2) 코드의 재사용성

만약 저 로또의 중복을 제거하는 역할의 함수를 다른 곳에서도 중복 제거하는 용도로 사용할 수 도있지않을까?

그럼 단순히 우리는 다른 곳에서 저 함수를 호출하기만 한다면 기능을 이용할 수 있는 것이다.

 

3) 구조적인 프로그래밍

우리는 이제 계층적으로 코드를 나누어서 여러 개체들을 그룹으로 묶을 수 있고,

중복적으로 코드의 그룹을 그룹핑할 수도 있다. 각 함수 안에 동일한 개념의 변수를 묶을 수도 직관적으로 확인할 수도 있다. 

 

 

3. Java함수 정의하는 방법.

functionName();

public static void functionName(매개변수){}

공용어인 영어를 사용하며, 앞글자는 소문자로 하며, 띄어쓰기 부분에서는 camelCase를 사용한다
함수명을 작성할 땐 동사를 먼저 앞글자로 내세우며 뒤에 명사나 목적어를 쓰면 한눈에 파악하기 쉽다

public static의 의미는 나중에 알고 void도 나중에 하며 코드처럼 함수를 사용하면 된다.

반응형

댓글