[JAVA] 객체지향(3)

ho's·2022년 4월 4일
0

위 글은 4/2(토)의 수업 내용을 정리한 것입니다.
더 자세한 내용은 https://www.facebook.com/groups/codingeverybody/posts/7530033737037097/ 을 참고해 주세요.


필드(field)

  • 클래스가 가지는 속성을 자바 언어에서는 필드라고 말한다.
  • 다른 언어에서는 멤버변수라고 말하는 경우도 있다.
  • 필드는 어떤 키워드와 함께 사용하느냐에 따라서 사용 방법이 달라진다.
  • static이라는 키워드가 함께 사용되는 필드는 클래스 필드, 함께 사용되지 않는 필드는 인스턴스 필드라고 한다.

필드 선언 방법

[접근 제한자] [static][final] 타입 필드명 [=초기값]

  • 대괄호 안에 있는 내용은 생략가능하다는 뜻이다.
  • 접근 제한자는 public, protected, 아무것도 없는 경우(default), private이 올 수 있다.
  • 필드명은 식별자 규칙을 따른다. 첫번째 글자는 소문자로 나타내자.
  • 타입(type)은 기본형(boolean, byte, char, short, int, long, float, double)과 참조타입(class,인터페이스, 배열) 등이 나올 수 있다.
  • 초기값이 없을 경우에는 참조형일 경우 null로 boolean형일 경우 false로 나머지 기본형은 모두 0으로 초기화 한다.

Person Class 작성하기

인스턴스를 생성한 후, 객체 p1이 갖고 있는 name, address, isVip를 출력해보았다.

그림으로 나타내어 보자.

String 클래스에 대해 알아보기

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html

위의 공식 문서를 보자.


Object를 상속받았고, 생성자는 클래스의 이름과 같으니 String()으로 표현된다

String클래스의 메소드

공식문서처에 나타난 것처럼 많은 메소드가 있다.
그 중 length()에 대해 알아보자. 반환값은 int이고 String의 길이를 반환한다고 나타내어진다!

Person클래스에 static한 field 생성하기


위와 같이 static한 필드를 Person클래스에 생성했다.
PersonTest 클래스에 가서, count의 값을 출력해보자.

p1.count++;을 했는데, p1,p2모두 값이 하나씩 늘어나는 것을 발견할 수 있다.

왜 그럴까? 이유를 알아보자!

위의 코드가 어떻게 돌아가는지 하나하나 뜯어보자.

1. 자바 javavirtualmachine이 Person 클래스가 있는지 확인한다.(CLASSPATH를 통해)

2. 클래스를 찾게 되면 정보를 메모리에 올린다.(클래스 정보 자체는 정적이다. 왜냐하면 정보는 가만히 있기 때문이다)

3. Person 클래스를 읽고, Person클래스가 가지고 있는 static한 필드가 있는지 확인한다.

4. Person이 갖고 있는 static한 필드를 저장할 곳을 별도의 메모리 영역에 잡아준다.

다시 코드로 돌아가보자.

위의 코드는 p1.count++, p2.count++; 와 같이 p1객체, p2객체의 count값을 따로 +1; 한 것같지만,
count가 Person클래스의 static한 필드이기 때문에, count변수는 Person클래스에 메모리가 따로 저장이 된다.
따라서 객체를 생성하지 않아도, count를 사용할 수 있다.

Person클래스에 메소드 추가하기

위의 두 개의 메소드를 비교해보자.

public void printName(){
	System.out.println("내 이름은:" + name);
}

인스턴스 메소드이다.
즉, Person객체를 생성해야지 사용할 수 있다.

public static void printName(){
	System.out.println("count:" + count);
}

은 클래스메소드이다. 인스턴스를 생성하지 않아도,

[클래스이름.메소드이름] 을 이용해서 사용 할 수 있다.

여기서 잠깐!

Person클래스에서 printCount()를 사용 할 때, name, address, isVip를 사용 할 수 있을까?

바로 확인해 보자.

안 된다는 것을 알 수 있다.

즉, static 한 메소드에서는 인스턴스 필드나, 인스턴스 메소드를 사용 할 수 없다.

왜냐하면 메모리가 생성되는 시점이 다르다.

static한 메소드 내에서는 static한 필드만 쓸 수 있다.

재밌는? 놀이를 해보자

일단, Hello2가 실행되는 순서를 알아보자.

컴파일 순서

  1. javac Hello2.java
  2. java Hello2

2번째 단계에서
1)CLASSPATH에서 Hello2를 찾는다
2)Hello2 클래스 자체에 대한 정보를 메모리에 올린다.
3)Hello2 클래스를 읽어주는 과정에서 static한 필드나 메소드가 있으면 사용 가능하게 메모리에 따로 올린다.
4) static한 필드는 static한 블록을 이용해 초기화 할 수 있다.

앞에서 배웠던 것처럼, Hello2가 실행될 수 있는 것은 static한 메소드가 있기때문에 클래스 Hello2 객체를 따로 만들지 않아도 실행이 된다.


내용 정리

이해가 안되면 익숙해지자

  • new 연산자를 사용할 때마다 메모리에 인스턴스가 저장된다.
  • 인스턴스는 더 이상 참조되는 것이 없을 때, 나중에(언제될지는 모른다. 보통 메모리가 부족할때) 가비지 컬렉션(Garbage Collection) 된다.
  • static한 필드는 클래스가 로딩될 때 딱 한번 메모리에 올라가고 초기화 된다.
  • 인스턴스 메소드(static이 안붙은 메소드)는 인스턴스를 생성하고나서 레퍼런스 변수를 이용해 사용할 수 있다.
  • 클래스 메소드는 클래스명.메소드명()으로 사용가능하다.
  • 메소드 안에 선언된 변수들은 메소드가 실행될 때 메모리에 생성되었닥다, 메소드가 종료될 때 사라진다.

추상화

  • 중요한 것은 남기고, 불필요한 것은 제거한다.

책 [생각의 탄생]에 추상화와 관련된 내용을 캡쳐해본다.


내가 개발하고자 하는 영역에 맞도록, 추상화를 해야한다.


캡슐화

  • 관련된 것을 잘 모아서 가지고 있는 것을 캡슐화(encapsulation)라고 한다. 관련됟ㄴ 것을 잘 모아서 가지고 있을 수록 응집도(Cohesion)가 높다고 표현한다.

위와 같은 특징때문에 클래스이름을 잘 지어야 사용자의 혼란을 막을 수 있다.

profile
그래야만 한다

0개의 댓글