본문 바로가기
study_java/java_수강정리(~10.29)

[JAVA]8일차

by developer_j 2020. 5. 20.
728x90
반응형

< 8일차 수업 >

 

1. 클래스와 인스턴스 이해하기.

클래스는 변수(or 상수)와 함수로 구성되어 있다. 클래스 파일은 자바 컴파일러로 자바 소스코드(.java)를 바이트 코드로 구성된 파일(.class)로 바꾼것을 말한다. 클래스 파일에 기반하여 프로그램에 필요한 데이터가 메모리에 올라간다. 

인스턴스는 객체와 같은 의미로, 새로운 클래스형 변수가 new 생성자로 생성되었을 때 만들어진 인스턴스를 말한다. 음.. 따로 정의한 객체 클래스를 new 생성자로 .class파일로 만들어 메모리에 올리면 "인스턴스화"되는 것이며, 인스턴스화 된 것을 인스턴스라 부른다.

인스턴스 변수는 클래스 안에 있으면서 & 함수 바깥에 선언되어 있는 변수를 말한다. 클래스 내부에 선언되어 있기 때문에, 클래스 범위 내에서는 어떤 함수든지 접근이 가능하다. 인스턴스 변수는 멤버 변수,필드와 같은 의미이다.

 로컬 변수는 함수 내에 존재하는 변수를 말한다. 함수 안에서 선언되기 때문에 함수를 벗어나면 로컬변수도 영향력을 잃게된다. 지역변수라고도 한다. 


2. new 생성자 이해하기.

 

소스 파일 1: [Student.java] 

public class Student {
		int kor, eng, math;           //인스턴스 변수는 자동 초기화
		/*
		 * 만약 여기서 바로 int sum = kor + eng + math;을 한다면
		 *--> 초기화 된 값으로 연산을 하고 있으니, 0+0+0= sum에는 0이 저장됨.
		 *따라서, 인스턴스 변수로는 선언만 해주고 나머지 연산같은 것은 아래 함수들을 통해 해줄것!
		 */
		double result;

		int total() {
			int sum = kor + eng+ math;
			return sum;
	    }
		
		//점수 세팅.변수 값을 세팅한다 해서 세터 (setter) 함수라고 부른다.
		void setGrade(int k, int e, int m) {  
			kor = k;
	 		eng = e;
	        math = m;
	    }
		
	    //평균구하기
		double average(){
	    	int total = kor + eng + math;
	        result = total / 3.0;
	        return result;
	    }
	}

코드 추가설명 :

int kor, eng, math;   

☞ 인스턴스 변수. 클래스 영역 내에서 제일 위에 선언해주는 이유는 클래스 내 모든 범위에서 사용할 수 있도록 하기 위해서이다. 이 변수들은 컴파일러가 자동으로 초기화한다. 정수형/실수형이면 0으로 초기화하고, 문자열이면 NULL로 초기화한다. 따라서, 이 코드 바로 아래에 있는 주석처리된 코드(sum 연산 코드)도 함수가 아니라 직접 연산을 진행하게 되면 값이 0이 나오므로, 함수를 통해 연산을 해주는 것이 좋다.

 

소스 파일 2: [StudentCls.java]

public class StudentCls {
	public static void main(String[] args) {
			Student std = new Student();
			std.setGrade(90,80,70);	 // 점수를 세팅하고
			
			int total = std.total(); // 점수 합계를 int total 변수에 저장 
	       
			System.out.println(total);   // 점수 총합 출력
		}
	}

코드 추가설명 :

std.setGrade(90,80,70);

int total = std.total(90,80,70);

.setGrade 함수를 호출하여 점수를 세팅하고, total 함수를 호출하여 그 합계를 다시 int형 total변수에 할당한다. 참조형 변수의 함수실행은 "객체명.함수명"으로 접근하여 실행한다.

위의 코드들은 객체를 사용한 코드이다.  main 함수의 new 키워드는 새로운 객체를 생성한다. 하나하나 뜯어보자.

 

①Student ②std = ③new ④Student();

 

①Student →  만든 클래스의 이름

자료형 자리에 Student가 있네? 내가 알던 기본 자료형이랑 다름! 

데이터 타입은 크게 두 분류로 나뉜다.

1. 기본형(primitive type) : 8가지. 자바에서 제공하는 기본 자료형. 소문자로 시작

2. 주소형(참조형.reference type) : 기본형 8가지 빼고는 다 참조형. 주소형으로 선언된 변수는 변수이름으로 접근 할 수 있음. 대문자로 시작.  클래스형 변수(참조형 변수)에는 특정 데이터가 아닌 참조값(주소값)을 대입하는 것이다. 

따라서, 위의 자료형이 클래스명으로 되어 있으니 기본형 8가지가 아니며 & 자료형 이름 시작이 대문자 = std는 자료형이 주소형인 변수이다.

 

②std  변수명

그냥 변수명이니 추가설명 생략!

① + ② = 클래스 타입의 참조형 변수 선언. 

              

③new  → 생성자 키워드

모든 변수나 함수는 써먹으려고 만든다. 그럼 class도 써먹을 수 있게 메모리에 올려줘야 한다. 메모리에서 이를 사용할 수 있도록 클래스를 new 키워드로 생성해주어야 한다는 것이다. new를 통해 인스턴스를 생성하면 생성된 인스턴스의 주소값이 반환된다. 즉, 참조변수에는 생성된 인스턴스의 주소값이 저장된다.

+) 객체에 접근해서 직접적으로 변수값을 바꾸는 것은 권장되지 않는다. 함수를 통해 접근한다.

+) 클래스 1개당 소스파일 하나를 생성해주는 것이 권장 된다.(이 때, 클래스 이름과 소스 파일 이름을 똑같이 한다.)

        

④BankAccount();  → 생성하려는 객체 클래스명

생성하고자 하는 클래스 형태를 명시해준다.

 


3. 생성자 과정 메모리 구조 해하기

main 함수에서 std라는 변수의 자료형은 클래스 타입이다. 그럼 이 타입은 메모리 공간이 몇 바이트로 할당될까?  

우선 메모리 주소 관리는 운영체제(OS)가 한다. 하지만 자바를 이용할 때는 자바 가상 머신이 메모리를 관리할 수 있도록 OS가 메모리를 넘겨준다. 자바 시스템은 32bit 시스템인데, 이말인 즉슨 자바 가상머신이 관리하는 메모리는 32비트까지 주소 표현이 가능하다는 것이다. 따라서 클래스형 변수의 데이터 크기도 default 크기로 4 바이트 공간이 할당된다. 그리고 이 공간에는 클래스형 변수에 대입하도록 설정된 클래스 생성자의 첫번째 주소값이 들어가게 된다.

나는 이렇게 이해했다. 객체를 생성했고 그 객체에 접근하기 위해, 객체의 주소값을 저장해야한다. 주소값도 어쨌든 값이다. 즉, 값이 주소를 나타낼 뿐 똑같은 값이므로 그 값을 할당할 변수가 필요하고 그 변수는 주소값 할당 전용인 참조형 변수이다.

또한 클래스 내에 선언된 인스턴스 변수들과 함수들에 대해서도 4 바이트 공간을 잡는다(자바의 디폴트 값을 기억해보자).

결론: 변수에 주소가 들어있으면 그 변수는 참조형 변수이고 참조하고 있는 것은 객체, 인스턴스이다. 

728x90
반응형

'study_java > java_수강정리(~10.29)' 카테고리의 다른 글

[JAVA]10일차  (0) 2020.05.22
[JAVA]9일차  (1) 2020.05.21
[JAVA]7일차  (0) 2020.05.19
[JAVA]6일차  (0) 2020.05.19
[JAVA]5일차  (0) 2020.05.15