[Java] 객체지향 언어 / 클래스

이유은·2023년 11월 14일
0

[Java]

목록 보기
11/18

드디어. 나온 객체지향. 어쩌고 !
오늘부터 이론 뿌시기 갑니다.


🎲 객체지향언어 intro

  • 자바의 가장 중요한 부분!
  • 80년 초 - 소프트웨어의 위기 - 빠른 변화를 못 쫓아감
    세상은 빠르게 변하는데, 그거에 맞춰 소프트웨어를 바꿔야함 . 근데 너무 빨라 !!!
    소프트웨어 못 쫓아가면 안쓰게 됨. 소프트웨어도 발전해가면서 유지가 됨
    기존의 프로그래밍언어로는 이 빠른 변화를 못 쫓아감. (c언어 등)
    해결책으로 객체지향 언어를 도입 (절차적 -> 객체지향)
    1960 simula -> smalltalk 등 변화
    기존 씨언어에 객체지향 언어 도입한게 c++ /
    기능은 좋은데 어려워서 확산이 잘 안됨 .
    그 다음 자바가 씨쁠쁠 단점 보완하고 좀 쉽게 만들어서 90년대 일반화됨
    자바는 1996년에 나옴!

    그전만해도 절차적 -> 순서대로 진행되는거
    객체지향 -> 절차적언어에 비해 코드의 재사용성을 높이고 유지보수 용이, 중복코드 제거 등

객체지향 언어 = 프로그래밍 언어 + 객체지향개념(규칙)

// 어려운것이 아니라 , 기본언어에 몇가지 규칙, 개념이 추가 된 것 뿐
// 왜 추가됐어? 코드의 재사용성(코드를 한번만들면 그걸 다른데서 쉽게 사용할 수 있도록), 유지보수 용이(소프트웨어 변경되더라도 적은노력으로 그 변화에 대응할 수 있도록), 코드중복 제거!

객체지향언어(oop:pbject-oriented programming) 핵심적 네가지 특징

  1. 캡슐화
  2. 상속
  3. 추상화
  4. 다형성

객체지향개념은 어떻게 공부해야 하나요?

- 일단 외우세요..&&
- 규칙을 알아야 합니다.
- 근데 규칙은 그냥 외우세요. 왜 생겼는지는 접어두고 실습으로 ㄱㄱ!
- 반복한다.
- 이개념을 알지 못하면 뒤에거 배워도 소용없음!!ㅠㅠ

객체지향언어 - 설계에 관한 내용
따라서 이해한 정도로만은 쉽지가 않아 ~~~ 많이 배우고 따라해보고 !! 실습해보자 !!!


🤹‍♀️ 클래스와 객체

클래스의 정의 - 클래스란 객체를 정의해 놓은 것
// 객체를 정의한다는 것 - 어떤 객체가 이러이러하다.
이 객체가 어떻게 되어있는지 설명해놓은 것

클래스의 용도 - 클래스는 객체를 생성하는데 사용

객체의 정의 - 실제로 존재하는 것. 사물 또는 개념
객체의 용도 - 객체가 가지고 있는 기능과 속성에 따라 다름

ex
클래스 - 제품설계도 / tv설계도, 붕어빵기계
객체 - 제품 / tv, 붕어빵

설계도 있으면 제품을 쉽게 만들잖아 ~
티비를 만드려면 설계도를 만들고 ~ 그걸로 티비 만들쥬

객체의 구성요소 - 속성과 기능

객체지향 개념 - 실제세계를 어떻게하면 컴퓨터 안으로 옮겨 놓을까? (미사일 쏠 때 컴퓨터에 설계해놓고 여러번 쏴보면, 바람불때, 비올때 등등 테스트 해보면서 시행착오 줄일 수 있음.)
하드웨어를 소프트웨어화 하는 것 !!!
실제세계를 분석&관찰 tv라는 하드웨어를 소프트웨어로 만들어서 컴퓨터안에 설치해서 컴퓨터로 티비를 보듯이 ~~ ~~
jvm도 마찬가지(?)
티비를 놓고 어떻게 소프트웨어화 할까?
소프트웨어화 한다는 것은? - 프로그램으로 만든다 !!!
프로그램은 머야? - 코드 !

그렇게 관찰을 했더니, 티비라는 객체 (사물)가 속성과 기능으로 표현가능

🎈객체 = 속성(변수) + 기능(메서드)🎈

로 표현하면 된다 ~~~

티비 속성을 봤더니, 크기 길이 높이 색상 볼륨 채널 등
티비 기능을 봤더니, 켜기 끄기 볼륨높이기 볼륨낮추기 채널 변경하기 등

분석한 내용을 가지고 코드를 작성해보면
속성은 변수로 / 기능은 메서드로

class Tv {

String color; // 색깔
boolean power; // 전원 상태
int channer; //채널

void power() {power = !power; }
void channelUp() { channel++;}
void channerDown() {channel--;}
}

티비라는 하드웨어를 관찰해서 속성과 기능을 뽑아낸 다음
이 속성,기능을 변수와 메서드로 바꿔서
하나의 티비라는 클래스를 만들어냄 .

클래스 - 설계도
따라서 저 코드는 티비 클래스이면서 티비 설계도가 된다.

☄️ 객체와 인스턴스!!

객체 : 모든 인스턴스를 대표하는 일반적 용어
인스턴스 : 특정 클래스로부터 생성된 객체 (예:tv 인스턴스)

결론부터 말하자면 둘이 거의 비슷한(?) 같은(?) 말

이 두가지 용어가 같이 나와서 헷갈릴 수 있지만 같다고 보면됨 .

클래스 --인스턴스화-> 인스턴스(객체)

설계도 왜만들어? 제품을 만드려고, 그 설계도로 제품을 만드는걸
인스턴스화 라고 한다! (제품생성)

우리가 사용하려는건 제품이야!! 클래스가 아니라, 설계도만 만드는건 부족하고
인스턴스화 해서 제품을 만들어야 우리가 사용 가능


☄️ 클래스와 객체

Q. 클래스가 왜 필요한가 ? - 설계도 왜 필요해?
A. 객체를 생성하기 위해. (설계도 한번 만들어두면 그다음부터 제품 만들 때 편하잖아 ~)

Q. 객체는 왜 필요한가? - 제품 왜 필요해?
A. 우리가 사용하려고 !! 객체를 사용하려고 ~

Q. 객체를 사용한다는 것은?
A. 객체가 가진 속성(변수)과 기능(메소드)을 사용하려고


☄️ 하나의 소스파일에 여러 클래스 작성

하나의 소스 파일 -> hello.java 라는 파일에
class를 두개 넣을 수 있음

기본적으로 퍼블릭 클래스이름하고 소스파일 이름 일치해야해.
퍼블릭 클래스가 없을 때는 소스파일의 이름을 클래스 이름중 둘중 하나로 하면 돼!

잘못된 예
- 하나의 소스파일에는 한개의 퍼블릭만 존재해야하는데 여러개 있는 경우!!
- 퍼블릭 클래스가 한개지만 그 이름과 소스파일 이름이 일치하지 않는 경우
- 자바는 대소문자 구분하기 때문에, 대소문자까지 일치해야한다.

실습을 해봅시당 ~

public class Hello2 {} //소스파일의 이름은 public class이름과 일치하도록
class Hello3{}
class Hello4 {}

이렇게 하나의 소스파일에 클래스 여러개 만들 수 있음~
*** 그런데 !! 하나의 소스파일에는 하나의 클래스만 작성하는 것이 바람직!

** 소스파일 이름바꾸기 / 원하는 파일 우클릭 - 리팩터 - 리네임


☄️ 객체의 생성과 사용

이전, 클래스(설계도) 작성 하는 방법 배움

이제
객체의 생성과 사용을 배울거야 ~

1. 객체의 생성

객체를 다루려면 참조변수가 필요해 ! (티비를 다루려면 리모콘이 필요하듯이~)
리모콘을 만들어주고, 객체 생성
그 다음 대입연산자로 두개를 연결해준다!!

클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조 변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성후, 객체의 주소를 참조변수에 저장

Tv t; // tv클래스 타입의 참조변수 t선언
t = new Tv(); // tv인스턴스를 생성한후, 생성된 tv인스턴스의 주소를 t에 저장

자바에서 리모콘(참조변수)이 꼭 필요!
참조변수를 선언해주고 객체 생성해서 연결!!!!

Tv t = new Tv();

새로운 티비를 하나 만들어서. 리모콘하고(t) 연결!

객체를 다루려면 참조변수(리모콘)이 필요하다.



2. 객체의 사용(객체가 가지고있는 변수,메소드 사용한다)

t.channer = 7; //Tv인스턴스 멤버변수 channel1의 값을 7로 한다.
t.channelDown(); //tv인스턴스 메서드 channelDown()을 호출한다.
System.out.println("현재채널은"+t.channel+"입니다.");

참조변수 티 가 가리키는 객체의 변수 채널에 7을 저장 / 변수에 7을 저장
참조변수 티가 가리키는 객체의 채널다운이라는 메소드를 호출 / 메서드 사용
채널다운 메소드가 호출되면 - 티비클래스에 정의된 메서드에 있는 문장들이 실행됨!

과정정리하면.
1. 클래스 작성
2. 객체 생성
3. 객체 사용
3단계로 처리 // 클래스 작성(설계도) -> 제품생성 -> 제품 사용

사용하는 방법은 리모콘을 통해서 접근 !!!
t !!!! 리모콘 t와 연결된 객체의 채널이라는 변수에 7을 저장

여기까지는 간략한 설명
자세히 가봅시다.


class Tv {

String color; // 색깔
boolean power; // 전원 상태
int channer; //채널

void power() {power = !power; }
void channelUp() { channel++;}
void channerDown() {channel--;}
}

티비라는 클래스를 만들어 두고!

Tv t; // Tv클래스 타입의 참조변수 t를 선언
이게뭐야? 변수 선언문.
변수타입은? 티비 / 기본형이 아님. -> 참조형임 !
우리가 티비를 만들거니까 티비 타입의 리모컨, 티비 리모컨이 필요해

t = new Tv(); 하면 객체 생성됨

참고 / 자바의정석 - 남궁석

100번지에 만들어졌다고 가정, 메모리 어딘가에 비어있는 곳 주소를 갖게 됨.
만들어진 객체의 주소가 반환됨 / 뉴연산자가 - 객체 만들고 주소 알려줌
t = 0x100 이 대입되는거야.
이 주소가 저장이 됨! 대입연산자에 의해!!!

리모콘 하고 티비를 연결해줘

앞으로는 이 티비 객체를 다룰때, 이 티비 리모콘 t를 이용해서만 다룰 수 있음. 리모콘 없이 다룰 수 있는 방법 없어!!!

리모콘 타입하고, 생성하려는 객체의 타입하고 일치해야함.
객체를 사용하려면 반드시 리모콘이 필요함!

생성된 객체하고 참조변수. 연결해줘야함

이번엔 객체를 두개 만들어보자!!

각각 t1, t2는 별도의 저장공간
t1의 채널값을 바꿔도 -> t2의 채널값은 변함 없음

만약
t2 = t1; 이라는 걸 쓴다면,
변수 티원에있는 값을 티투에 넣어라! 그럼 티투의 채널도 7이됨.

이제 못쓰게된 t2는 가비지 컬렉터(청소부) 가 주기적으로 메모리를 확인하고 있다가, 이런 사용못하는애 찾으면 메모리에서 제거를 함.
불필요하게 메모리가 낭비되는일 없도록함 .

자바는 우리가 직접 필요할 때 객체를 만들었다가, 가비지 컬렉터가 알아서 정리해줌 .


정리!

t1, t2 두개의 참조변수로 하나의 객체를 가리키는 게 가능해, 주소 같게 하면!

하나의 참조변수로 두개의 객체 가리키는거? 불가능 !!

변수: 하나의 값만 저장 가능


☄️ 객체배열

객체배열 == 참조변수 배열
참조변수 배열을 객체 배열이라고 부름

Tv tv1, tv2, tv3; -> Tv[] tvArr = new Tv[3];
Tv타입 참조변수 x3


이렇게 생각해 !!

참조변수 배열 가장 많은 질문은?
배열만 생성해놓고서!! (참조변수만 만들어진거임)
이거 객체를 만들어서 넣어줘야하는데, 이걸 깜빡하는 경우가 많음
배열만 만들어 놓는 경우가 많다는 뜻 ~~~


☄️ CLASS의 정의

클래스 - 설계도 , 데이터 + 함수 즉 데이터와 함수의 결합 , 사용자 정의 타입

이렇게 세가지로 정의할 수 있음
설계도는 앞에서 배웠고,

데이터와 함수의 결합에대해 !!!

클래스 == 데이터 + 함수

1. 변수 : 하나의 데이터를 저장할 수 있는 공간
2. 배열 : 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간
배열의 한계 - 같은 종류만 저장할 수 있음

이게 발전해서.

3. 구조체 : 서로 관련된 여러 데이터(종류 관계 X)를 하나로 저장할 수 있는 공간
배열과의 차이점 -> 같은 타입이 아니어도 됨, 다른 타입도 ok

왜 묶을까? 서로 관계가 있으니까 !!
서로 관계있는 것들을 하나로 묶어서 다루면 편리하니까 ~

이 구조체에서 더 발전한 것이 바로

CLASS!!!

구조체까지만해도, 서로 관계있는 애들로 묶었어(타입은 달라도)

클래스에서는 이 변수들(데이터)을 함수와 같이 묶은 것!
왜 함께 묶었냐? 서로 관련있는 데이터 변수들끼리만 묶을 게 아니라, 함수들도 관련있다면 같이 묶자 이것이 클래스야.

함수나 메서드 같은 말,,, 명령문의 묶음

어떤 하나의 작업을 하는 명령문들을 하나로 묶은게 함수
근데 함수가 어때 ? 어떤 작업을 하잖아 . 계산 !! , 작업할 때 뭘 가지고 해? 데이터를 가지고 하지 않겠어? 숫자,문자 등 데이터를 가지고 작업하지 않을 때도 있지만 주로 가지고 함 . 이런 데이터가 있을 때, 이 데이터와 관련있는 함수는 같이 묶어놓는 것이 편리하다. 이래서 합쳐 놓은 것이 클래스!

자 다른 정의는!!!

사용자 정의 타입 !

우리가 정의한 타입. 원하는 타입을 직접 만들 수 있다.
그 타입이 바로 클래스

ex
시간을 다루고 싶어. 시간, 분, 초 세가지 값을 저장하기 위해서 인티저타입 변수 선언해. 여러 시간 다루고 싶어서, 시간분초 각각 세개씩 만들고~~ 어쩌고 하든가 배열을 이용해!

그래도 문제가 생길 수 있잖아. 그러니가 그냥
시 , 분 , 초 변수를 묶은 타임이라는 클래스를 만들자

그러면 코드가 간결해지고, 문제들이 해결돼


☄️ 선언위치에 따른 변수의 종류

변수의 타입에 대해서 얘기했었는데, 이번엔 종류에 대해서 알아봅시다 .
변수의 종류는 어디에 선언했냐에 따라서 종류가 3가지로 나눠짐 .

1. Iv - 인스턴스 변수
2. cv - 클래스 변수(static, 공유 변수)
3. lv - 지역 변수

클래스 안에는 영역이 두가지가 있음

  • 클래스영역

  • 메소드 영역

    클래스영역에 선언되는 변수는 iv
    메서드 영역에 선언되는 변수는 lv - 지역변수 local variable

    영역에 선언된 변수는 iv,lv가 있고
    cv는 iv앞에 static이 붙은 애다.. (먼솔..)

    영역은 두개밖에 없어 !!!
    클래스 영역은 머야
    클래스시작부터 끝까지가 . 클래스 영역이야
    메서드 영역은 -> 메소드 시작 부터 메소드 끝까지

    클래스 영역에는 -> 선언문만 가능!!
    변수선언, 메소드 선언(정의)
    선언문의 순서는 상관 없음

클래스 변수 - 클래스 영역 전체에서 사용가능 // 생성시기 - 클래스가 메모리에 올라갈 때 // 클래스가 필요할 때 / 객체 생성 안해도 자동으로 만들어짐 / 객체 생성 필요없음 !!

인스턴스 변수 - 클래스 영역 전체에서 사용가능 // 생성시기 - 인스턴스가 생성되었을 때 !! 중요 !! // 객체 생성 필요
이 두개는 클래스 영역에

지역변수 - 클래스 영역 이외의 영역에 (메소드, 생성자, 초기화 블럭 내부) // 언제생겨? - 변수 선언문이 수행되었을 때 / 메소드 종료시 자동 제거

객체 = iv를 묶어둔 것

쉽게 말하면!
cv - 아무때나 사용 가능 / iv - 객체 생성 해야 쓸 수 있음


☄️ 클래스 변수와 인스턴스 변수

cv : 클래스 변수
iv : 인스턴스 변수

원카드를 기준으로, 카드 하나하나는 객체야.
숫자-무늬 는 객체마다 다르게 유지되어야 하는 개별!!
폭-높이 는 모든객체가 공통적으로 가져야 하는 애

개별 속성 - iv / 인스턴스 변수
공통 속성 - cv / 클래스 변수 / static

객체 생성 하고 -> 객체 사용하는 순서인데
iv,cv 사용법이 비슷한데 cv에는 클래스 이름을 써주는 것이 좋다. (참조변수도 가능하긴 함/권장 안함)
//참조변수처럼 바뀌면 c1,c2중 하나만 바껴도 두개다 바뀜!!! 그래서 걍 클래스 이름으로 하는 것이 좋아 ~ 헷갈리자넝

iv는 객체마다 존재/ cv는 항상 한개 !!

cv는 객체 생성 없이 사용 가능 .

profile
우당탕코딩

0개의 댓글