20211022 객체, 변수, 메소드

DUUUPPAAN·2021년 10월 22일

·어제에 이은 객체복습

-사실 어제 객체를 왜 생성해야 하는지에 대해 굉장히 확실하게 배웠다. 기존에는 그냥 객체를 생성해서 써야하는가보다 싶었었다. 그런데 코드의 재사용성과 유지보수에 용이하다는 사실을 깨닫고 왜 자바가 다른 언어들보다 더 각광받는지 깨달았다.

-오늘은 그 부분을 어제에 이어서 복습하고 객체배열에 대해 추가로 배웠다. 내용을 깊이있게 배웠다고 보기는 어렵다. 그냥 어떤 구조로 되어있는지에 대해 배웠다. 사실, 곰곰히 생각해보면 충분히 어떤 느낌일까 알 수 있었지만, 그래도 직접 설명해주시고 구조를 그려주셔서 이해가 더 쉬웠다.

Tv[] tvArr = new Tv[3];

Tv라는 클래스가 있고 해당 클래스가 정의되어 있다고 할 때,
Tv[] tvArr = new Tv[3];이 실행되면 메모리에서 tvArr이라는 공간을 배정받는다. 해당 공간은 연속적으로 위치해있는 tvArr[0], tvArr[1], tvArr[2]의 주소값 중, 첫 주소값을 입력받는다. 그리고 tvArr[0], tvArr[1], tvArr[2]은 아직 주소값이 없이 참조형이기 때문에 초기값인 null값이 입력되어 있다.

int i;
for(i=0;i<tvArr.length;i++)
{
	tvArr[i] = new Tv();
}

여기까지 반복문을 통해 선언되면, 메모리 영역에 Tv클래스의 모든 속성과 배경을 가진 객체가 3개 만들어지고(연속하게 배정될 수도, 떨어져 있을 수도 있다. 배열이 아니기 때문에 연속할 필요가 없다.) ,각각의 tvArr[0], tvArr[1], tvArr[2]는 만들어진 객체가 가진 주소값이 입력된다. 그 후엔, 객체를 선언했듯이 사용하면 된다. 사실 이게 전혀 편하지 않은 느낌이 있긴한데, 그래도 언젠가는 어딘가에 쓰이기 때문에 배웠을 거라 생각하기에 잘 기억해놔야겠다.

·선언위치에 따른 변수의 차이

20210923에 교재를 통해서 정리했던 내용을 오늘 다시 배웠다. 인스턴스 변수와 스태틱 변수, 그리고 메소드 내에서 정의되는 멤버변수에 대해 배우면서 해당 부분을 실습해봤다. 특히 card라는 물체를 사용했다. 카드는 각각 다른 속성과 다른 값을 가지고 있지만, 카드 각각의 크기는 똑같다. 즉, 속성과 값은 각각의 카드가 다르게 갖고 있지만, 크기는 전부 동일하다. 그래서 각각의 속성과 숫자는 인스턴스 변수로, 크기는 스태틱변수로 설정해줘서 공유하도록 설정했다. 이렇게 어떤 범위에서 변수속성을 어떻게 줘야하는지도 굉장히 중요하다. 만약 크기를 인스턴스 변수로 설정한다면, 카드 크기가 변했을 때, 일일이 하나씩 변경해줘야 하는 불상사가 생기기 때문이다.

·메소드의 파라미터(매개변수)

-메소드의 파라미터는 보내준 값을 받는 지역 변수이다. 그리고 이 지역변수가 받는 것은 값이지 보낸 변수나, 배열명이 아니다. 해당 변수나 배열명 객체명 등에 담긴 값을 받는 것이다. 그래서 보낸 변수와 받은 변수가 같은 이름이여도 사실상 다른 영역을 갖고 있는 것이다. 이 내용은 이미 화요일에 직접 정리해봤다. 그래서 해당 내용은 굉장히 이해하기 쉬웠다. 값을 보낸다는 것의 의미!

·메소드 만들고 사용하기

-배열을 만들고, 해당 배열에 값을 입력한다. 그리고 해당 값들을 출력하는 메소드, 배열의 값들을 오름차순으로 정렬하는 메소드, 배열의 모든 값들을 더하는 메소드를 정의하고 직접 불러와서 사용해보는 문제를 풀어봤다.

public class Program1022 {

	public static void main(String[] args) {
		int[] arr = new int[] {3, 2, 1, 6, 5, 4};
		
		printArr(arr); // 배열 모든 요소 출력
		System.out.println();
		
		sortArr(arr);  //배열 내용을 오름차순으로 정렬
		printArr(arr);
		
		System.out.println();
		System.out.println("sum = "+ sumArr(arr));
	}	
	
	static void printArr(int[] iArr) 
	{
		int i;
		for(i=0;i<iArr.length;i++) 
		{
			System.out.println("arr["+i+"] = "+iArr[i]);
		}
	}
	
	static void sortArr(int[] iArr) 
	{
		int i, j, tmp, least;
		for(i=0;i<iArr.length-1;i++) 
		{
			least = i;
			for(j=i+1;j<iArr.length;j++) 
			{
				if(iArr[least]>iArr[j]) 
				{
					least = j;
				}
			}
			if(i != least) 
			{
				tmp = iArr[i];
				iArr[i] = iArr[least];
				iArr[least] = tmp;
			}
		}
	}
	
	static int sumArr(int[] iArr) 
	{
		int i, sum=0;
		for(i=0;i<iArr.length;i++) 
		{
			sum+= iArr[i];
		}
		return sum;
	}
}

사용해봤던 selection sort를 메소드로 사용할 수 있어서 정말 기분 좋은 문제였다. 다른 사람들은 교환을 굉장히 자주하는 코드를 사용했는데 나는 교환횟수가 적은 코드를 적었다는 것도 무언가 기분이 좋았다.

·사실상 복습

-사실 오늘은 새로 뭔가를 배웠다기 보다는 다시 복습하는 기분이 물씬 드는 수업이었다. 그래도 집에서 비대면 수업을 진행한 하루였기 때문에, 다른 분들이 열심히 문제를 푸는 시간에 문제를 다 풀고 다른 문제를 풀거나 다른 문제들을 찾아서 풀어봤다. 집에서 공부하면 이런 이점이 있다는 것이 장점이라면 장점인 것 같다.

주말이다. 그러나 당장 또 토요일에는 병원 진료를 받아야 하고, 일요일에는 부모님을 도와드릴 일이 있다. 휴... 휴일이 없는 기분이지만, 최대한 체력을 비축해야지. 프로젝트 시작하면 정말 정신없고 체력적 한계도 많이들 온다고 하니, 미리미리 체력을 비축하자!!! 할 수 있다! 파이팅!

profile
비전공자란 이름으로 새로운 길을 가려 하는 신입

0개의 댓글