6-1 Class

Cloudman·2022년 11월 21일
0

항해99 자바 공부

목록 보기
1/10

이전시간 프리 온빌딩 기간동안에 공부했던 책에서 이어서 공부한다.

그러닉 이 글의 이전글을 읽어보려면 사실상 프리온빌딩 때 썻던 글부터 차례차례 읽어보면 된다.



★ 진행과정 ★

  • 클래스 (6 챕터)
    ◎ 스터디 그룹으로 진행
    ▶ 6-1 : 객체 지향 프로그래밍
    ▷ 6-2 : 필드
    ▷ 6-3 : 생성자
    ▷ 6-4 : 메소드
    ▷ 6-5 : 인스턴스 멤버와 정적 멤버
    ▷ 6-6 : 패키지와 접근 제한자



📒 클래스


📋 객체 지향 프로그래밍

객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지면서 식별 가능한 것을 말한다.
객체는 속성과 동작으로 구성되어 있다.
ex) 속성 : 자동차 // 동작 : 달린다
자바에서는 이 속성과 동작을 각각 필드(field)메소드(method) 라고 한다.

객체를 만들고 이를 조립해 완성된 프로그램을 만드는 기법을 !!!
객체 지향 프로그래밍 이라고 한다.



📋 객체의 상호작용

객체들은 각각 독립적으로 존재하고, 다른 객체와 서로 상호작용 하면서 동작한다.
객체들 사이의 상호작용 수단이 바로 메소드 이고, 이 때 객체가 다른 객체의 기능을 이용하는 것이 메소드 호출 이다.

이태까지 흔하게 사용했던 return 을 예로...


리턴값 : 객체, 메소드(매개값1, 매개값2, ... );

  • 객체에 도트(.) 연산자를 붙이고 메소드 이름을 기입한다.
    도트 연산자는 객체의 필드와 메소드에 접근할 때 사용
  • 매개값은 메소드를 실행하기 위해 필요한 데이터이다.
    1과 2를 더하는 기능이라고 하면 1, 2 가 더하기 기능의 매개값이 된다.
  • 리턴값은 메소드가 실행되고 난 후 호출한 곳으로 돌려주는 값이다.

자바에서 사용되는 모습은 아래의 사진과 같다.




📋 객체 간의 관계

객체는 개별적으로 사용될 수 있지만, 대부분 다른 객체와 관계를 맺고 있다.
이런한 관계의 종류 에는, 상속관계 사용관계 집합관계 가 있다.

  • 1. 집합 관계
    에 있는 객체는 하나는 부품이고 하나는 완성품에 해당한다.
    ex) 자동차 - 엔진, 타이어, 핸들 로 구성
    이 부품들을 집합관계라고 보면 된다.
  • 2. 사용 관계
    객체 간의 상호작용을 말한다.
    객체는 다른 객체의 메소드를 호출하여 원하는 결과를 얻어낸다.
    사람과 자동차의 관계를 예로 들 수 있다.
    사람은 자동차를 사용할 때 달린다, 멈춘다 등의 메소드를 호출한다.
  • 3. 상속 관계
    상위(부모) 객체를 기반으로 하위(자식) 객체생성하는 관계
    일반적으로 상위 객체는 종류를 의마하고, 하위 객체는 구체적인 사물을 말한다.
    ex) 기계(상위) - 자동차(하위)




📋 객체와 클래스

자동차를 만들려면 설계도가 필요하다는 말을 자바로 풀이하면
설계도클래스를 말한다고 보면 된다.
클래스에는 객체 생성을 위한 필드메소드가 정의되어 있다.
이 클래스로 부터 만들어진 객체를 해당 클래스의 인스턴스(instance) 라고 한다.
ex) 자동차 객체는 자동차 클래스의 인스턴스

클래스로부터 객체를 만다는 과정을 인스턴스화 라고 한다.

위 그림 처럼 하나의 클래스로부터 여러개의 인스턴스를 만드는것이 가능하다 !!

순서로 치면 아래의 순서대로 진행된다고 보면 된다.

  1. 클래스 설계
  2. 설계된 클래스를 가지고 사용할 객체 생성
  3. 생성된 객체를 사용




📋 클래스 선언

객체를 구상하고 나면 이제 그 객체를 의미하는 이름을 짓는다.
이를 클래스 이름으로 정한다.
단, 이 때에는 다른 클래스와 식별할 목적으로 사용되므로 자바의 식별자 작성 규칙을 따라야 한다.

🔖 식별자 작성 규칙

  • 하나 이상의 문자로 이루어져야 한다.
    ex) Car, SprotsCar
  • 첫 글자에는 숫자가 올 수 없다.
    올바른 예 : Car (O)
    잘못된 예 : 3Car
  • '$', '_' 외의 특수문자는 사용이 불가능하다.
    올바른 예 : %Car, _Car
    잘못된 예 : @Car, #Car
  • 자바 키워드는 사용할 수 없다.
    ex) int, for

만약 단어가 두개 이상 들어가면 각 단어의 첫 글자는 대문자로 작성하는 것이 일반적이다.
ex) ChatClient, CharServer, Web_Browser


클래스 이름을 정하고 나면
이제 '클래스 이름.java' 로 소스 파일을 만든다.
소스 파일의 이름 또한 대문자로 구분하므로 반드시 클래스 이름과 대소문자가 같도록 해야 한다.

public class 클래스 이름 {

}

public class 키워드는 클래스를 선언할 때 사용된다.
이 때 사용된 키워드는 반드시 소문자로 작성해야 한다.
클래스 이름 뒤에는 반드시 중괄호{} 를 붙여주는데, 이를 통해 클래스 선언의 시작과 끝을 알 수 있다.

위에서 배운 자동차를 예로 들어서 보자면...

public class Car {

}

class Tire {

}

위 처럼 볼 수 있다. 일반적으로는 소스 파일당 하나의 클래스를 선언하지만 두 개 이상의 클래스 선언도 가능하다.

2개 이상의 클래스가 선언된 소스 파일을 컴파일 하면 바이트 코드 파일(.class)은 클래스를 선언한 개수만큼 만들어진다.

내가 사용중인 인텔리제이를 기준으로 사진상에 보이는 JavaPrac12 와 같은 파일들을 말한다.

즉, 소스 파일(.java)은 클래스 선언을 담고 있는 저장 단위이지 클래스 자체가 아닌다.




📋 객체 생성과 클래스 변수

클래스를 선언한 다음, 컴파일을 했다면 객체를 생성할 설계도를 만들었다는 의미이다.
이제 클래스로부터 객체를 생성하려면 new 연산자를 사용하면 된다.

new 클래스();

🔖 new 클래스

객체를 생성시키는 연사자를 말한다.
new 연산자 뒤에 오는 생성자가 클래스() 형태 를 가지고 있다.
new 연산자로 생성된 객체는 메모리 힙(heap) 영역에 생성된다.

메모리 내에서 생성된 객체의 위치를 알아야 사용이 가능하다.
즉, new 연산자를 통해 힙 영역에 객체를 생성시킨 후 객체의 번지를 리턴 하도록 한다.
이 주소를 참조 타입인 클래스 변수에 저장해두면 변수를 통해 객체의 사용이 가능하다.


클래스로 선언된 변수에 new 연산자가 리턴한 객체의 번지를 저장하는 방법

클래스 변수;
변수 = new 클래스();

클래스 변수 선언과 객체 생성을 한 개의 실행문으로 작성하기

클래스 변수 = new 클래스();

new 연산자로 객체를 생성하고 리턴된 객체의 번지를 변수에 저장하면 위의 그림과 같이 변수가 객체를 참조하게 된다.



📌 직접 해보자 !!!

StudentExample 를 실행하면 메모리에 클래스 변수와 객체가 생성된다.
Student 클래스는 하나지만, new 연산자를 사용한 만큼 객체가 메모리에 생성된다.

이러한 객체들을 Student 클래스의 인스턴스 라고 한다.
여기서 s1 과 s2 가 참조하는 Student 객체는 완전히 독립된 서로 다른 객체이다.

실행해본 결과 ↑↑↑



📌 클래스의 용도

클래스는 두 가지 용도가 있다. 라이브러리 와 다른 하나는 실행용 이다.

1. 라이브러리 클래스
다른 클래스에서 이용할 목적으로 설계
2. 실행용
프로그램 전체에 사용되는 클래스가 50 개 라면 49 개는 라이브러리 클래스이고 단 하나가 실행용 클래스 이다.

실행 클래스는 프로그램의 실행 진입점인 main() 메소드를 제공하는 역할을 한다.

위에서 예시로 만든 StudentStudentExample 을 예시로 설명하자면

라이브러리 클래스 - Student
실행용 클래스 - StudentExample

위 처럼 볼 수 있다. 하지만 아래의 예시처럼 하면 Studentmain() 메소드를 작성해서 라이브러리인 동시에 실행 클래스로 만들 수도 있다.

프로그램이 단 하나의 클래스로 구성된다면 위와 같이 작성하는 것이 좋을 수 있지만,
대부분의 객체 지향 프로그램은 라이브러리와 실행 클래스가 분리되어 있다.
따라서 상황에 맞게 적절하게 사용해주는 것이 좋다.




📋 클래스의 구성 멤버

클래스에는 객체가 가져야 할 구성 멤버가 선언된다.
구성 멤버에는 필드(Field), 생성자(Constructor), 메소드(Method) 가 있다.
이 구성 멤버들은 생략되거나 복수의 개수로 만들 수 있다.

📌 필드(Field)

객체고유 데이터, 부품 객체, 상태 정보 를 저장하는 곳이다.
선언 형태는 변수(variable) 와 비슷 하지만 필드를 변수라고 부르지는 않는다.
필드는 변수와 다르게 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다.


📌 생성자(Constructor)

new 연산자로 호출되는 특별한 중괄호{} 블록 이다.
생성자의 역할은 객체 생성시 초기화를 담당한다.
필드를 초기화 하거나 메소드를 호출해서 객체를 사용할 준비를 한다.
클래스 이름으로 되어 있고 리턴 타입이 없다.


📌 메소드(Method)

객체의 동작에 해당하는 중괄호{} 블록을 말한다.
중괄호 블록은 이름을 가지고 있는데, 이것이 메소드 이름이다.
즉, 어떠한 특정 작업을 수행하기 위한 명령문의 집합

장점으로 말하면, 메소드를 작성하여 사용하면 중복되는 코드의 반복적인 프로그래밍을 피할 수 있다.




🔗 핵심 정리

클래스 : 객체를 만들기 위한 설계도
객체 : 클래스로부터 생성되면 new 클래스() 로 생성한다.
new 연산자 : 객체 생성 연산자이며, 생성자를 호출하고 객체 생성 번지를 리턴합니다.
클래스 변수 : 클래스로 선언한 변수를 말하며 해당 클래스의 객체 번지가 저장됩니다.
인스턴스 : 객체는 클래스의 인스턴스 입니다.
클래스 멤버 : 클래스에 선언되는 멤버는 필드, 생성자, 메소드가 있다.

profile
코린이

0개의 댓글