20210923 연휴 후 첫 수업

DUUUPPAAN·2021년 9월 23일
0

교육 20210915~ Java

목록 보기
5/13

·내 뜻대로 되지 않은 연휴

-분명 나는 연휴에 제대로 된 계획이 있었다. 충분한 휴식과 함께, 복습+예습을 철저히 하고 영어 공부와 운동을 좀 더 많이 할 계획이 있었다. 그러나, 그 계획은 첫날이 되기 전부터 무너졌다.

-부모님과 형의 부재, 부모님은 원래 외국에 계시니 부재중인 것이 당연하시고, 형은 갑자기 오래 만난 여자친구의 부모님을 뵙기 위해서 부산으로 가버렸다. 그로 인해, 할머니와 고모를 모시고 산소를 다녀오고, 시골 어른들께 인사드리고 오는 모든 일을 내가 도맡았다. 연휴 시작 전날인 일요일날 그 사실을 알게 되었고, 책은 커녕 짐도 제대로 챙기지 못했다. 그리고 나서 추석 마지막 날인 어제는, 부모님의 명령과 여자친구의 부탁으로, 여자친구의 부모님께 인사드리고 왔다. 오래 만났으니 당연한 일이지만, 사전에 계획한 모든 것들을 할 시간과 여유가 없었다. 왜 연휴가 지났는데, 평소와 비슷한 수준의 피로감이 있는지 모르겠다. 그래도 운동과 영어 공부는 하긴 했는데, 운동은 평소같이 유튜브를 따라했지만, 역기 없이 한 맨몸운동 수준이고, 영어는 어플로 공부했기 때문에 그나마 나은 정도였다.

-그래서 예습은 고사하고, 복습조차도 많이 하지 못했다. 벨로그 작성은 더더욱 엄두도 못냈다.

·계획과는 달랐지만, 교수님의 복습!

-계획과는 다른 연휴였지만, 교수님이 그런 우리들의 사정을 잘 알고 계신 것인지, 복습을 잘 해주셨다. 수업시간에 진행한 복습이라 엄청나게 많이 하지는 못했지만, 그게 어디인지... 잊혀졌던 기억들이 돌아오고, 혼자서 작성하고 있는 코드들을 보면서, 그래도 복습을 하는 시간이 참 다행이구나 싶었다.

·드디어 객체!

-늘 자바를 배우면 시작하는 말이, '자바는 객체지향적 언어로써....'였다. 그런데 도대체 객체가 무엇인지를 지금까지 제대로 설명도 못 들었다. 물론 찾아봤지만, 검색과 수업시간에 설명을 듣는 것은 천지차이다.
-사실 오늘 객체에 대한 설명을 듣고 구글링도 하고 해보니, 객체를 왜 설명해주시지 않았는지 어느정도 이해는 갔다. 지금까지 사용하고 있었지만, 범위가 너무 커서 무엇이 객체다라고 콕 짚어주기가 애매한 개념이긴 했다. 그래서 여러 블로그를 봐도, 객체를 무엇이라고 설명하기 보다는 자동차나 자전거, 사람 등에 빗대어 설명하고 있다.

객체란 물리적 혹은 추상적으로 생각할 수 있는 것 중 자신과 다른 것을 식별가능한 것을 말한다. <-이 설명이 가장 그래도 개념적인 설명이었다.

그리고 객체는 크게 속성과 동작이 있는데, 이 속성을 필드, 동작을 메소드라고 한다.

물리적 혹은 추상적으로 생각할 수 있는 객체를 소프트웨어적으로 설계하는 것이 객체모델링이라고 한다.
객체 모델링은 1. 객체 특성->특징, 성질->소프트웨어적으로는 필드, 변수
2. 객체 기능->객체가 할 수 있는 행위->소프트웨어적으로는 메소드
를 도출하는 단계
객체 모델링에서 객체 특성은 변수이며, 객체 기능은 메소드.
클래스 내부에 작성된 변수는 멤버변수, 메소드는 클래스 내부의 함수라고 보면 됨.

Class는 객체를 설계해 놓은 것이며, 자바 언어 프로그램의 최소 단위이다.
특정 객체를 어떻게 프로그램화할지 설계하는 것!

·객체 생성

-객체 생성의 순서: 1. 참조형 변수 선언 2. 객체 생성 후 참조형 변수에 대입
자바에서 객체의 위치는 레퍼런스 값으로 변수에 저장되고 사용된다.
즉, 변수 선언이 필요하다
단!!! 일반 변수와 값을 저장하는 방식이 다르다.
ex>
int age = 10;
위의 경우 stack영역에 바로 10의 값이 저장된다.

Age age0 = new Age();
위의 경우 객체 변수로 stack영역에는 레퍼런스 값만 저장되고, heap영역에 구체적인 값들이 저장된다.

객체 생성 후 참조형 변수에 대입하는 법:
클래스명 객체변수명 = new(연산자) 클래스();
=전까지는 레퍼런스 변수를 선언한 것이고, =를 포함한 그 다음부터는 객체변수명의 객체를 생성하는 것이다.

같은 class로 생성된 객체들은 같은 클래스로 생성되었다고 하더라도 독립적이다.

Age age0 = new Age();
Age age1 = new Age();
Age age2 = new Age();

위에서 age0,age1,age2는 전부 같은 클래스로 생성된 객체지만, 각각 독립적인 객체!

package AirCon;

class AirCon {
	String company;
	String color;
	int price;
	int size;
	int temp;
	
	void powerOn() {
		System.out.println("power on");
	}
	void powerOff() {
		System.out.println("power off");
	}
	void upTemp() {
		temp++;
	}
	void downTemp() {
		temp--;
	}
}

AirCon class

package AirCon;

public class AirConUse1 {

	public static void main(String[] args) {
	AirCon airCon = new AirCon();
	
	airCon.color = "white";
	airCon.temp = 10;
	airCon.price = 10000;
	
	airCon.upTemp();
	System.out.println(
			"airCon.temp = " + airCon.temp+ ", airCon.color = "+airCon.color+", airCon.price = "+ airCon.price+"원"
			);
	airCon.powerOn();
	airCon.powerOff();
	airCon.downTemp();
	airCon.downTemp();
	airCon.downTemp();
	airCon.downTemp();
	System.out.println(
			"airCon.temp = " + airCon.temp+ ", airCon.color = "+airCon.color+", airCon.price = "+ airCon.price+"원"
			);
	
	}

}

AirCon class를 사용해 객체변수를 만들어서 해당 객체의 변수와 메소드를 사용.

·변수의 종류-(선언위치에 따른 종류)

-변수는 선언 위치에 따라서 2가지로 나뉜다.(영역의 기준은 class임)

class의 내부= 멤버변수 -> 1.인스턴스 (멤버)변수
-> 2. 스태틱 (멤버)변수
(static 키워드의 유무)
메소드 내부 = 3. 로컬 변수

  1. 인스턴스 변수 -class 안, static 키워드 x
    인스턴스 변수는 객체 생성 시 각 객체별 초기화된다.
    만약 선언 시에 초기화하지 않으면, 컴파일러가 자동으로 기본값으로 초기화 시킨다.
    기본값은 데이터 타입에 따라 다른데,
    정수형: 0
    실수형: 00
    문자(char): '','\u0000'
    boolean: false
    참조형: null(아무 값도 없다는 뜻.)

  2. 스태틱 변수 - class 안, static 키워드 o
    정의할 때 초기화하지 않으면, 컴파일러가 자동으로 기본값으로 초기화시킨다.
    static 변수는 클래스 로드 시, Class Area의 Static 영역에 바로 초기화가 되기 때문에, 해당 클래스로 생성된 모든 객체에서 공유된다.
    스태틱 변수는 다른 클래스에서 객체 생성하지 않아도, 해당 클래스 이름으로 바로 참조가능함.

  3. 로컬변수 - 메소드 안
    변수 정의 시 초기화하지 않으면 컴파일 오류가 난다.
    변수가 정의된 메소드 안에서만 사용가능하고, 메소드 실행 시 stack영역에서 초기화되며, 메소드 종료 시 메모리에서 소멸한다.

public class VariableKind {
	//인스턴스 멤버 변수
	int memVar;
	//스태틱 멤버 변수
	static int staticVar;
	
	public static void main(String[] args) {
	//로컬변수
	int localVar;
	
	VariableKind vk1 = new VariableKind();
	System.out.println("vk1.memVar = "+vk1.memVar);
	//스태틱 변수는 객체에서 참조해도 되고, 해당 클래스 이름으로 참조해도 되고, 동일한 레벨인 static 메소드에서는 그냥 바로 써도 됨.
	System.out.println("vk1.staticVar = "+vk1.staticVar);
	System.out.println("VariableKind.staticVar = "+VariableKind.staticVar);
	System.out.println("staticVar = " + staticVar);

	VariableKind vk2 = new VariableKind();
	vk2.memVar = 100;
	vk1.staticVar = 20;
	System.out.println("vk1.memVar = "+vk1.memVar);
	System.out.println("vk2.memVar = "+vk2.memVar);
	System.out.println("vk1.staticVar = "+vk1.staticVar);
	System.out.println("vk2.staticVar = "+vk2.staticVar);
	
	//System.out.println("localVar = "+localVar); 초기화를 안시켜줌. 그래서 이거 주석 풀면 컴파일 오류남. 오류 없애려면 값설정해주면 됨.
	}

}

·메소드

메소드는 다음과 같이 구성되어 있음
1. 리턴 타입
2. 메소드 이름
3. 파라미터
4. 구현코드

  1. 리턴 타입- 메소드가 리턴하는 값의 데이터 타입을 정해준다. return 예약어를 사용해서 리턴해줄 수 있다.(return은 비단 리턴 값을 리턴시켜줄 뿐만 아니라, 조건문과 함께 특정 메소드를 종료시키는 기능도 한다.)
    리턴 타입은 int, long, float, void가 있는데, void의 경우 리턴 값이 없다는 뜻이다. 그래서 return 예약어를 생략할 수 있다. 이제 드디어 public static void main의 void와 static을 이해할 수 있게 되었다.

  2. 메소드 이름은 메소드를 사용할 때 우리가 불러야하기 때문에 필요하다.

  3. 파라미터 값은 있을 수도 없을 수도 있고, 여러개일 수도 있다. 다만, 일반적으로 파라미터의 수와 데이터 타입은 인자의 수와 데이터 타입과 동일해야한다.
    ※인자는 호출 시 던져주는 값, 파라미터는 메소드에서 받는 값을 저장하는 변수다. 혼용하는 경우가 많은데, 확실하게 구분하자!

·개념적인 설명, 왜 이토록 반가운가

-오늘은 실습보다도 개념적인 설명이 많은 하루였다. 보통 실습이 없는 개념수업이라면 정말 싫을 것 같지만, 계속 실습에서는 쓰였는데 정작 그게 무엇인지 모르는 경우가 있다면 개념적인 설명이 이렇게 반가울 수가 없다. 그동안은 몰랐지만, 지금 알기엔 너무 이른 개념들이라 설명 없이, 혹은 부족하게 지나쳤던 것들이 드디어 설명되었다. 드디어 리턴값이 무엇인지 리턴 예약어가 왜 쓰였는지, 객체는 무엇이고, 메소드는 무엇인지를 알게 되었다. 객체 지향 언어라고 배우고 있는 자바, 그런데 정작 나는 객체가 무엇인지 어떻게 구성되어 있는지도 몰랐다. 답답했다. 그런데 오늘은 뭔가 속이 뻥 뚫리는 수업이었다. 그래서 그런지 교수님의 설명이 조금 부족하더라도 기쁜 마음으로 해당 개념을 구글링하면서 더 이해를 시켰다. 그리고 정말정말 재미있었다.

·그동안의 불평불만, 왜그랬을까

오늘은 교수님의 부족한 설명이(개인적으로) 불평할 점이 아닌 더 성장할 수 있는 부분이라는 것을 느꼈다.. 설명이 조금 덜 된 만큼, 검색해서 찾으면 그만큼 더 많이 알 수 있게 되는 것 같았다. 앞으로도 부족한 설명에 이의를 제기하고 불평불만하기 보다는 스스로 찾아서 해결할 수 있는 사람이 되려한다. 언제까지 학원에서 수업만 듣고 있지는 않을테니까.. 그런 것을 느낀 하루였다. 자바의 기본적인 것들을 이해하면서 더욱 기쁜 날이기도 했고, 앞으로 개발자로서 살아가면서 스스로 배우는 일을 당연시하는 마음가짐도 배우는 날이었다.

연휴가 끝나고 첫날, 정말 소중한 하루를 얻었다.
이제 운동하고 영어공부하고 내일의 수업을 향해 잠을 청해야지!

  1. 다시 벨로그 열심히 작성하고, 깃허브에 코드 잘 정리하기!
  2. 운동!
  3. 영어공부!
  4. 휴식도 잘 취하기!
profile
비전공자란 이름으로 새로운 길을 가려 하는 신입

0개의 댓글