본문 바로가기
Language/Java

JAVA입문-4 (클래스와 객체)

by 드럼치는 코린이 2021. 2. 21.
728x90
반응형

[클래스 선언]

Java는 객체지향 언어 : 프로그램을 구성하는 요소는 객체이며 이것이 상호작용 하도록 프로그래밍한다.

클래스 : 객체를 만들기 위한 틀

ex. 붕어빵을 만든다면
붕어빵은 객체, 붕어빵을 만드는 도구는 클래스

ex. 클래스 선언

public calss 클래스명{
......
}

new(연산자) 뒤에 나오는 Car(생성자)라 함.
이런 생성자를 이용해 메모리에 객체를 만들라는 명령이다.
메모리에 만들어진 객체를 인스턴스라고도 말한다.
만들어진 객체를 참조하는 변수가 c1, c2이다.
위에 코드를 통해 만들어진 것을 Car라는 객체가 2개 만들어지고 각각의 객체를 참조하는 c1과 c2 변수가 선언이 된다.

[참조 타입]

Java는 변수를 선언하려면 변수의 타입을 정해줘야 한다.

기본형 타입은 클래스가 아니다.

ex. 자바의 변수 타입

출처(프로그래머스 자바 입문)

ex. 기본 타입과 참조형 타입

출처(프로그래머스 자바 입문)

String 클래스의 변수(레퍼런스=참조) str은 new 연산자를 통해 생성된 String 객체(인스턴스)를 참조한다.

[String 클래스]

Java에서 가장 많이 사용하는 클래스는 String 클래스.

String의 특징 1_ new 연사자를 사용하지 않아도 사용할 수 있다.
                   2_ 한 번 생성된 클래스는 변하지 않는다.

그래서 Java에서는 String 클래스를 특별하게 취급해서 new 연산자를 사용하지 않아도 사용할 수 있다.

new 연산자를 사용하지 않으면 상수들이 저장되는 영역에 저장되어 변하지 않는 값이 된다.
new 연사자를 이용해 인스턴스를 만들면 상수 영역을 참조하지 않고 무조건 새로운 영역에 만들게 된다.

ex. new 연산자를 사용하지 않아도 String 클래스 사용 가능 and new 사용 여부에 따른 차이점

ex. String은 메서드를 사용하여도 그 형태는 변하지 않는다.

ex. == 연산자는 같은 레퍼런스인지를 비교, .equals 메서드는 같은 문자열인지 비교.

 

[필드(field) 선언]

필드(field)란 객체의 속성입니다.

ex. 문자열 타입 필드 name과 정수 타입 필드 number를 저장하는 Car 클래스를 선언하는 코드이다.

ex. Car 클래스를 선언 후 CarExam 클래스에서 각 Car 객체에 필드를 저장.

[메서드란?]

객체지향 언어란? 하나의 사물을 하나의 클래스로 설명하는 것.

객체(사물) 안에는 필드(상태)와 메서드(행동)가 들어감.
필드(이름, 번호) , 메서드(전진, 후진)

출처(프로그래머스 자바 입문)

  • 메서드(Method)

입력값 : 매개변수 or 인자라고 함
결과값 : 리턴 값

매개변수 (Parameter) : 전달된 인자를 받아들이는 변수를 의미한다.
인자 (Argument) : 어떤 함수를 호출 시에 전달되는 값을 의미한다.

출처(프로그래머스 자바 입문)

[메서드(Method) 선언]

<리턴 타입의 형태>

  • void : 매개 변수가 없을 때 사용한다.

  • int : 정수 타입의 매개 변수가 있을 때 사용한다.

  • 리턴 타입의 형태는 int 외에도 기본형 타입과 참조형 타입 모두 사용할 수 있다.

ex. 다양한 형태의 메서드(Method)

출처(프로그래머스 자바 입문)

[메서드 사용해보기]

앞에서 만들어본 'MyClass' 클래스를 통해 메서드를 사용해보자.

메소드를 사용해보기 앞서 클래스가 가진 메소드를 사용하기 위해서는 객체로 만들어야 사용할 수 있다.

  • 1번 메서드

매개변수와 리턴 값이 없는 메서드이기 때문에 객체.메소드();만 입력하면 원하는 문장을 출력할 수 있다.

  • 2번 메서드

매개변수 int x가 있기 때문에 객체.메서드(int x);에서 int x값을 입력해주면 원하는 문장을 출력할 수 있다.

  • 3번 메서드

매개변수는 없지만 리턴 값이 있으므로 그 값을 받아낼 변수가 필요하다.
리턴할 값이 int이기 때문에 int 변수를 만든다.
객체.메서드();가 실행된 후 리턴한 값을 int 변수가 받아줌.
(만약, int 변수를 만들지 않고 객체.메서드();만 입력 후 출력하면 그냥 메소드3의 실행값이 출력된다.)

  • 4번 메서드

매개변수 int x, int y가 있으므로 정수 값을 넣어주면 원하는 문장을 출력할 수 있다.

  • 5번 메서드

매개변수 int y에 정수 값을 넣고 리턴 값이 있으므로 int 변수를 하나 만들어 메서드 5의 실행 값을 받아 출력한다.

[String 클래스의 메서드]

  • 보통 객체를 생성할 때 생성자를 이용해 객체를 생성하는 것이 일반적인 방법

String str = new String("hello");
  • 다만, Java에서 String 클래스는 굉장히 빈번하고 유용하게 사용되는 클래스이기 때문에 간단하게 생성할 수 있도록 제공한다.

String str = "hello";

 

String 객체에는 정말 많은 메서드가 존재한다.
객체마다 사용할 수 있는 메소드가 다양한데 그 수많은 메서드를 사용할 줄 알아야만 그 객체를 사용할 수 있는 것은 아니다. 마치 청소기를 사용하기 위해 모든 사용법, 기능들을 완벽히 숙지해야 사용할 수 있는 것이 아닌 것처럼.
보통은 자주 사용하는 기능들을 주로 사용한다.

  • String 객체에서 자주 사용하는 기능들

1) .length(); : 문자열의 길이를 구해서 리턴해주는 메서드 (공백도 하나의 문자열로 인식)

 

2) .concat(); : 문자열과 문자열을 결합해주는 메서드

주의할 점 : String 객체를 바꿔버리면 다른 참조하고 있는 변수들에게 문제가 생기므로 String은 한번 만들어진 참조를 바꾸지 않습니다. (불변 클래스)

출처(프로그래머스 자바 입문)
출처(프로그래머스 자바 입문)

 3) .substring(); : 문자열을 잘라낸다. (2가지 방법이 존재)

[변수의 scope와 static]

변수의 사용 범위 -> 변수가 선언된 블록 (scope)

★ 클래스는 붕어빵의 틀.
모든 클래스는 인스턴스화(객체) 하지 않은 채로 사용할 수 없다.
붕어빵 틀이 붕어빵이 아닌 것과 같은 이치.
메인 메서드에는 static 키워드가 있는데, static을 사용하면 인스턴스화 하지 않아도 사용할 수 있다.
그래서 static 한 메서드는 인스턴스화 하지 않아도 사용할 수 있기 때문에 static 하지 않은 필드는 사용할 수 없다.
static 한 메서드가 사용하는 시점에 해당 클래스가 인스턴스화 되지 않았을 수도 있기 때문.

ex. static하지 않은 변수를 사용하기 위해서는 객체를 생성하면 된다. (+ 클래스 변수)

★ 31~32번째 줄이 같은 값을 갖는 이유는 staticVal이 static 변수이기 때문에 29~30에서 서로 다른 값을 저장했지만 마지막에 지정한 100이란 값을 저장하게 된다. (클래스 변수)

<클래스 변수란?> static 한 변수는 값을 저장할 수 있는 공간이 하나밖에 없어서 값을 공유한다.
그렇기 때문에 클래스 이름을 직접 사용하는 것이 가능 (클래스 이름. 클래스 변수명) => 이렇게 쓰는 게 더 바람직하다.

[열거형(enum)]

Java는 열거 타입을 이용하여 변수를 선언할 때 변수 타입으로 사용할 수 있다.

열거형이 등장하기 전엔 public static final을 이용해 상수를 열거형 대신으로 사용을 했다.

gender1에는 MALE, FEMALE 둘 중 하나만 들어가게 하고 싶은데
gender1 변수는 string타입의 변수이기 때문에 어떤 string이 들어와도 컴파일상 문제가 없다.
그렇지만 실제 실행될 땐 남자 혹은 여자만 들어와야 하는데 그 이외 다른 값이 들어오면 문제가 될 것.
그래서 이런 문제를 방지하기 위해 열거형을 사용하면 된다.

열거형을 사용하는 방법 => 열거형 (enum 이름 { 값 1, 값 2; }

열거형을 사용하여 앞서 static에서 배운 것과 같이 클래스 변수를 사용 즉, 클래스 이름. 클래스 변수명을 이용해 Gender자체가 string타입이 된다.
열거형을 통해 string타입이지만 MALE, FEMAL 외에는 다른 값은 들어갈 수 없기 때문에 컴파일상 gender2 = "boy";는 오류를 발생할 수밖에 없다.

728x90
반응형

'Language > Java' 카테고리의 다른 글

JAVA입문-6 (상속)  (0) 2021.02.27
JAVA입문-5 (클래스 다듬기)  (0) 2021.02.26
JAVA입문-3 (배열)  (0) 2021.02.18
JAVA입문-2 (제어문)  (0) 2021.02.16
JAVA입문-1 (변수와 계산)  (0) 2021.02.13

댓글