JAVA 웹개발 과정 국비 10일차 정리

10일차

※ 배우는 과정이므로 정확하지 않을 수 있습니다.
잘못된 점은 알려주시면 수정하도록 하겠습니다!


1. Java Convention

  • 클래스의 이름은 대문자
  • 합성어의 첫글자는 대문자(camelCase)
    • lowercase : 소문자
    • uppercase : 대문자
  • 상수는 모두 대문자, 구분은 _(언더바)로 한다

2. (이어서) Method

1) Method overloading

overloading : 과적하다 -> 이름 하나에 기능 2개

메소드 이름은 겹치면 안된다.
그러나 파라미터에 차이가 있다면 다른 메소드로 인식한다.
C언어는 이 기능이 없지만, C++부터는 가능하게 바뀌면서, 자바까지 이어져왔다.
2개뿐아니라 3개도 가능하다.
그러나 리턴타입이 다르다고 overloading이 되는 것은 아니다.
대표적인 예로 println 메소드가 있다.

3. 객체지향 프로그래밍 (OOP)

1) 객체지향이란

C언어에서의 Header파일 개념과 구조체의 개념을 합쳐 Class라는 것이 탄생했다.
class 파일은 객체지향의 근간이 되는 가장 중요한 파일이다.
이 class 파일이 탄생함으로써 뭔가가 필요하면 다른 사람이 만든 class를 가져다 쓸 수 있게 되었고, 원리를 몰라도 가져다 쓸 수 있게 되면서 개발속도가 빨라지게 되었다.

2) 객체지향 코드를 작성하는 방법 : 4 Step

① 객체로 만들고자 하는 대상 선정

모니터를 대상으로 선정해보자.

public class Monitor {

}

② 대상에 대해서 속성과 기능을 분류, 정리한다

  • 속성 : brand, price
  • 기능 : 전원켜기 & 끄기, 밝기조절

③ 선정된 대상을 정리된 속성과 기능으로 설계한다

속성은 변수로 선언하고, 기능은 메소드로 만들어준다.

  • 속성 -> 변수
  • 기능 -> 메소드
public class Monitor {
	String brand;
	int price;
	
	void powerOn() {
		// 전원 켜기 코드..
	}
	void powerOff() {
		// 전원 끄기 코드..
	}
}

④ 설계된 대상을 인스턴스화 한다.

public class Main {
	public static void main(String[] args) {
		Monitor m = new Monitor();
	}
}

3) Instance (객체) 란?

이렇게 Monitor Class를 만들게 되면 Monitor는 참조자료형이므로, Monitor 변수를 생성할 수 있게된다.
Monitor m; 까지의 코드만 놓고 본다면, 아직 Monitor 클래스 안에 있는 변수 brand와 price는 존재하지 않는다.
stack 메모리에 m이라는 변수의 공간이 생성되기만 한 것이기 때문이다.
그러나 new Monitor(); 가 붙는다면 이야기는 달라진다.

new는 연산자로 두가지의 의미를 가진다.

  1. heap 메모리에 데이터를 생성해라
  2. 생성된 데이터의 주소값을 리턴해라

따라서 Moniter m = new Monitor();를 해줌으로써 heap 메모리에 Monitor라는 데이터가 만들어지고, 이 데이터의 주소값을 변수 m에 담아주게 된다.
여기서 heap 메모리에 만들어진 Monitor라는 데이터가 바로 instance(객체)이다.

4) 인스턴스에 접근하기

Monitor 설계도를 통해 m이라는 Monitor를 하나 만들어냈다.
그런데 어떻게 이 m에 접근할 수 있을까?
바로 . 이라는 참조연산자를 이용하면 된다.
m.을 하게되면 m이라는 주소를 찾아가라는 뜻이 된다.
.을 통해 m이라는 Monitor를 코드 속에서 만질 수 있게 되었다!

5) Member 변수

Monitor 클래스에 변수가 두가지 생겼다.
이 변수들은 지역변수가 아니라 member 변수라고 한다.

  • 지역변수 : 메소드 중괄호 안에 존재
  • 멤버변수 : 클래스 중괄호 안에 존재

이와 비슷하게 클래스 안에 있는 메소드를 멤버메소드라고 한다.

6) 정보은닉 규칙

외부로 보여질 필요가 없는 기능은 private 키워드로 감추고,
직접적인 접근을 차단해야하는 Field는 private으로 감춘 후 public method로 접근을 제한하는 방식

① 접근제한자

private < default(package) < protected < public

  • private
    • 클래스 내부에서만 접근 가능
  • default(package)
    • 아무런 접근제한자가 없을 때
    • 같은 패키지 내에서 접근 가능
  • protected
    • 나중에 배운다
  • public
    • 어디서든 접근 가능

② 정보은닉이 필요한 이유

  1. 클래스 개발자의 안정성을 높이기 위해
  2. 클래스 사용자의 편의성을 취하기 위해

예를 들어보자.
TV를 하나 구매했다.
TV의 채널을 바꾸려고 하는데, 이 채널이라는 것은 오픈되어있을까?
답은 ‘아니다’이다. 오픈의 범위는 우리 생각보다 크다.
TV채널은 우리 마음대로 바꿀 수 없다. -1도 없고 채널 값에 3743을 넣을 수도 없다.
TV를 판매한 회사의 어떤 제한 범위 안에서만 바꿀 수 있는 것이다.
만약 채널 값을 public으로 바꿔서 사용자가 채널을 막 바꿀 수 있다고 치자.
TV의 오류는 증가할 것이다.
여기서 1번의 이유를 이해할 수 있다.

그럼 벗어나는 값에 대한 예외처리를 하면 되는거 아닌가?
라고 생각할 수도 있다.
그러나 굳이 왜 그렇게까지 해야할까? 그냥 막아버리면 되는걸.
그리고 막은 걸 제어할 수 있게 하면 된다.
또한, 사용자의 입장에서는 필요없는 기능까지 보여준다면 사용하기가 까다로울 것이다.
여기서 2번의 이유를 이해할 수 있다.

③ 캡슐화

캡슐로 되어있는 감기약을 생각해보자.
캡슐을 열면 온갖 가루로 되어있는 약 성분을 알아야 하지만, 캡슐로 되어있는 약은 그냥 감기를 낫게해주는 약일 뿐이다.
이렇게 정보 은닉이 잘 되어있는 클래스를 캡슐화가 잘 되어있다라고 한다.

④ Setters & Getters

정보은닉 규칙으로 인해 민감한 Field를 private으로 차단하고 대신 안전하게 접근 가능한 setter와 getter 메소드로 Field에 접근한다.

  getter setter
parameter X O
return 값 O X
  • 이클립스 자동 생성 기능 이용
    1. alt + Shift + s
    2. r
    3. alt + a
    4. alt + r

7. 자기참조변수 this

public class Monitor {
	
	String brand;
	
	public void setBrand(String brand) {
		this.brand = brand;
	}
}

일단, 위의 코드를 보면 String brand 변수가 겹치는데도 에러가 나지 않는다.
저장되는 메모리 영역이 다르기 때문이다.

  • setter의 parameter : brand
    • 파라미터는 지역변수와 동일한 성질을 갖는다.
    • stack 메모리에 생성됨.
  • member field : brand
    • heap 메모리에 생성됨.

그리고 this를 모르기때문에, this를 제외하고 brand = brand; 코드를 보면 노란 줄로 IDE가 경고를 해주는 것을 볼 수 있다.
The assignment to variable brand has no effect
assignment는 할당(대입)이라는 뜻으로 brand 변수에 대입하는 행동은 아무 효과가 없습니다 라는 뜻이 된다.
이유는 변수의 이름이 이렇게 겹치게 되면 가까운 쪽이 대상이 되게 되므로 결국 이 코드의 뜻은 가까운 파라미터 brand 값을 같은 파라미터 brand에 넣어라 라는 뜻이 된다.
이 현상을 해결하는 것이 this이다.

this를 이해하는 방법은 순한맛 / 매운맛 두가지 방법이 있다.

  1. 순한맛 버전
    • 자신의 멤버필드만 선별하는 기능이다.
    • this.brand 의 뜻은 내 멤버필드 brand에 대입해 라는 뜻이 된다.
  2. 매운맛 버전
    • this는 멤버필드로 자동생성된다(암묵적 문법)
    • 생성된 인스턴스 자기 자신의 주소를 가진다.
    • 밖에서는 자신의 인스턴스 주소를 알 수 있는 반면에(주소값을 변수에 넣어줌으로써) 인스턴스 안에서는 this가 없으면 내 주소를 아는 변수가 없다. 그래서 만들어놓은 변수.

4. 그외..

  • 라이브러리
    다른 사람들이 설계도(클래스)를 가져다 쓸 수 있게 만든 것
  • Thread.Sleep(1000)
    실행중인 스레드를 잠시 멈추게 하는 메소드.
    파라미터는 밀리초로, 1/1000초이며 1000을 인자값으로 넣으면 1초동안 정지한다.

댓글남기기