* 자바

ㄴ 자바는 객체지향(OOP) 언어이다.
ㄴ 자바머신을 깔기만 하면 어느 환경에서든 사용 가능하다.
ㄴ 메모리를 다루려고 만든 언어가 아니다.
ㄴ 오히려 메모리 관리에 신경안쓰고 프로그래밍 할수 있게 지원하는 언어이다
ㄴ 자바 다음엔 C##이 유사한 점이 많으니 배우면 된다.




* 객체란 무엇인가?

ㄴ 객체란 모든 것이 될 수 있다
ㄴ 현실세계의 모든 것이 될수도 있고 인간의 상상력, 개념 등이 될수도 있다




* 자바란 이러한 객체를 컴퓨터에 구현하는 것이다




* 자바 컴파일과 객체 생성

ㄴ 자바 가상머신을 통해 구동이 되야 객체로서 구현이 되었다 말할수 있다.
ㄴ 구동 전엔 자바언어로 쓴 설계도에 불과하다.




* 자바에 객체구현

ㄴ 컴퓨터 상에서 현실의 객체를 구현하는 것은 소프트웨어적으로 구현하는 개념이다.
ㄴ 즉, 기능과 속성을 부여하고 상호작용 할 수 있도록 만드는 것이다.
ㄴ 이것을 인간이 일일이 구현을 해야한다.
ㄴ 자바의 속성과 개념을 알아야 한다.




* 자바의 개념 및 장점

0. 개발자가 의도하는 것을 데이터를 사용해 기능과 속성을 가진 객체로 만들고 서로 상호작용 할 수 있는 로직을 구성해 소프트웨어적으로 구현하는 방법을 지원한다.

1. 자바는 자바가 깔린 모든 환경(OS)에서 구동이 가능하다.
ㄴ 메모리에 자바 가상머신만 올릴수 있으면

2. 캡슐화를 할 수 있어 유지 보수가 용이하다
ㄴ 클래스, 팩키지

3. 상속개념을 통해 라이브러리를 사용할 수 있다
ㄴ 다중상속은 불가하다 // 인터페이스를 통하는 클래스면 다중상속 특성도 있는데 그건 나중에...

4. 코드를 재활용 할 수 있다. // 함수(메서드)

5. 큰 프로젝트에 용이하다.
ㄴ 모듈화

6. 오버라이딩, 오버로딩을 지원한다.
ㄴ 접근 제한자를 통해 충돌없이 사용 가능하다
ㄴ 클래스 안에 클래스(중복 클래스) // 이것도 나중에...

7. 다형성
ㄴ 부모이름을 자식도 쓸수 있다.

8. 추상화 ㄴ 클래스로 객체를 생성한다.




* 객체 구현엔 개발자의 용도와 의도에 따라 상호작용의 의미도 달라진다.

ㄴ 단순 계산 부터 오픈 월드까지
ㄴ 객체가 많아질수록 속성과 기능이 많아지므로 상호작용에 대한 고려도 많아진다.
ㄴ 자바에선 물리법칙, 모양, 특성 등 모든 것들이 객체이며 개발자가 다 구현을 해야하는 것임을 명심해야 한다.




* 그럼 자바에서 객체란 무엇인가?

ㄴ 현실의 객체를 자바 머신에서 구동하여 소프트웨어적으로 구현하려면 몇가지 개념이 필요하다.
ㄴ 이유는 입력된 데이터를 자바 가상 머신에 읽어들여서 구동하여 소프트웨어적으로 객체로 구현 하는 것이기 때문이다.
ㄴ 자바 머신이 구동되는 일련의 과정을 컴파일이라 부른다. exe를 눌렸을때가 바로 그것이라 생각하면 된다. // 자세한 구동 과정이 있지만 간단하게
ㄴ 즉, 가상객체를 구현하고 나아가 객체간의 상호작용이 있어야 하므로 충족해야하는 조건들이 있고 문법이 존재하는 것이다.




** 인스턴스(객체)

ㄴ 현실의 객체를 자바에서 구현한 객체를 인스턴스라고 부른다.
ㄴ 때문에 앞으로 객체라고 말하는 것은 자바안에 구현된 인스턴스와 동일시 하면 된다.
ㄴ 자바에서 객체의 최소단위는 클래스 안의 메소드와 변수로 구현된 속성과 기능이다.
ㄴ 클래스 안의 인스턴스(객체)를 '클래스 안의 인스턴스(객체)'라고도 부른다.
ㄴ 객체라고 하면 떠오르는 이미지는 자동차, 고양이, 비행기 등 이다.
ㄴ 하지만 그러한 것을 구현하려면 아주 작은 단위(볼트, 너트, 물리법칙 등)으로 쪼개서 객체로 만들고 그 객체들의 상호작용과 알고리즘을 정의해야 하는 것이다.
ㄴ 비유적으로 표현한 것이지 위에서부터 상속받아 오는 것이다. 밑에서 위로 올라가는게 아니라 위에서 아래로 큰 개념을 상속한다. 공구통이 위에 있는거다.
ㄴ 다시 한번 상기 하자면 객체란 모양 뿐 아니라 물리법칙, 수학공식 등 구현하려는 모든것을 객체로 정의하고 구현하고 객체간의 상호작용 마저도 객체나 로직으로 구성해야 사용할 수 있다는 것이다.
ㄴ 인스턴스는 기능/ 속성/ 메모리 3가지 조건을 충족해야 실존한다고 정의할수 있다.
ㄴ 실존하지 않는 인스턴스는 오류를 발생시킨다.
ㄴ 자바의 문법/ 구조/ 특성을 잘 이해해야 인스턴스(객체)를 오류없이 생성하고 다룰수 있다.

- 그래서 객체가 뭔가? 자바에서 비행기라는 객체를 구현하고 작동까지 되게 한다 가정하자.
1. 우선 최소단위의 객체(클래스 안의 인스턴스(객체))들을 생성하고 이들의 상호작용과 로직을 통해 볼트, 너트, 물리법칙 등의 객체단위를 정의한다.
2. 이렇게 정의된 객체단위를 간단하게 팩키지라고 생각하자.
3. 이렇게 정의된 객체 단위를 조립해서 엔진, 모터, 바퀴 등으로 만들고 이들을 또 조립해서 최종적으로 비행기 객체가 구현된다고 생각하면 된다.




* 메모리와 변수. 그리고, 클래스, 객체, 인스턴스




** 메모리

ㄴ 메모리와 변수개념은 어렵다.
ㄴ 때문에 기능적 측면을 중심으로만 익혀둔다.
ㄴ 자바의 개념 및 장점에서 보았듯 확장성과 코드재사용, 오버로딩, 오버라이딩 등을 지원한다.
ㄴ 이러한 자바 환경이 충돌없이 구동되기 위해 메모리 관리기법이 존재한다.
ㄴ 앞선 설명에서 인스턴스란 기능/ 속성/ 메모리 3가지 조건을 충족해야 실존한다고 정의할수 있다고 말했다.
ㄴ 또한 자바에서 객체의 최소단위는 클래스 안의 메소드와 변수로 구현된 속성과 기능이며
클래스 안의 인스턴스(객체)를 '클래스 안의 인스턴스(객체)'라고도 부른다는 것도 알았다.
ㄴ 클래스는 설계도이며 클래스를 선언하면 클래스에 대한 메모리가 생성된다.
ㄴ 클래스에서 정의한 메소드, 변수 등이 클래스에 배정된 메모리 안에서 구현되고 이를 인스턴스(객체)라고 부른다.
ㄴ 인스턴스는 선언한 클래스 안에 메모리가 있기 때문에 다른 클래스에서 사용하려고 시도해도 메모리가 없기때문에 실존 조건을 충족하지 못하고 null이 되어 상호작용을 못하고 오류를 발생시킨다.(다른 클래스 입장에선 새로운 변수를 선언한것처럼 인식할 것이다.)
ㄴ 클래스 경계를 넘어 객체를 사용하기 위해선 변수의 개념을 알아야 한다.




*** 클래스 안에 인스턴스(객체)

ㄴ 클래스 안에 객체는 하나 일수도 있고 여러개 일수도 있다.
---------------------------------
예시를 들어보자 클래스에 단팥빵을 설계했다고 가정하자.
그럼 클래스 메모리에 단팥빵은 하나의 객체로 구현 되겠지만 단팥빵 안의 팥을 객체로 사용할 수도 있고 단팥빵의 빵만 떼서 객체로 사용할 수도 있을 것이다.
즉, 객체란 클래스(설계도)대로 구현이 되는 것이고 클래스에 접근해서 내부 요소를 따로따로 불러와서 사용할 수도 있는 것이다.
이러한 특성을 고려해서 개발자의 의도에 따라 하나의 기능으로 구현할지 여러 기능을 담은 공구통처럼 사용할지 등이 정해진다는 것이다.
이렇게 생각해보면 객체란 것은 개발자의 의도에 따라 사용할 수 있는 기능/ 속성을 가진것 정도로 정리해두자.
---------------------------------




** 자바 구조

ㄴ 팩키지 > 클래스 > 메소드, 변수로 구성된다.
ㄴ 패키지 안에 클래스들은 개별 이름의 파일로 나눠져 있어 개별 존재 같지만 패키지 보따리에 함께 담겨 있고 상호작용한다.
ㄴ 하나의 파일엔 하나의 클래스만 만드는 것이 원칙이다.
ㄴ 하나의 패키지엔 하나의 main 메소드만 존재하는 것이 보통이다.




** 클래스

ㄴ 객체 설계도이다
ㄴ static은 static끼리만 접근할 수 있다.




** static

ㄴ 인스턴스 변수에 static을 붙이면 클래스 변수가 된다.
ㄴ static을 사용하면 자바가 컴파일 될때 static 메모리에 딱 한번만 올라간다.
ㄴ 이것을 참조변수를 사용하여 객체생성 없이 변수나 함수를 사용할 수 있다.




** 변수

ㄴ 말그대로 값이 변하는 것을 변수라 칭한다. 상수는 변경할 수 없다.
ㄴ int a = 1; 처럼 '데이터 타입'/ '변수명'/ '대입연산자'/ '초기값' 모두를 가진 변수를 일반변수라고 말한다.
ㄴ int a; 처럼 '데이터 타입'/ '변수명'/만 선언해줘도 메모리 공간이 생기지만 메모리 값은 디폴트값이 된다.
ㄴ 변수라는 것은 a를 칭하지만 선언을 안하면 아무것도 아니기에 선언을 해줘야 한다.
ㄴ 변수명엔 메모리 주소가 담기는데 변수명을 통해 변수를 사용하고 메모리를 다루게 된다.
ㄴ 일반변수는 선언된 클래스 내에서만 유효하다.
ㄴ 때문에 선언된 클래스 밖에서 사용하기 위한 3가지 방법이 존재한다.
----------------------------------------------------
- 변수에 대해 이해 하려면 비유가 필요하다.
ㄴ 패키지를 지구라고 생각하고 클래스를 국가라고 가정하자
ㄴ 국가에 태어난 국민1은 주민등록증과 집이 주어진다 가정하자.
ㄴ 클래스에서 선언된 변수는 주소와 메모리 공간이 주어진다.
ㄴ 국민1이 일본 여행을 가서 자기 집으로 우편을 붙인다고 가정하자.

-- 1. 한국을 나타내는 국제 주소를 주민등록증 주소 앞에 붙여준다.
ㄴ 일본에서 한국으로 우편을 붙이는 것이므로 주민등록증 주소대로 보내면 도착 못할 것이다. 앞에 한국명을 붙여야 할 것이다.
ㄴ 클래스와 클래스 사이도 외국처럼 분리 되어있으므로 클래스 명을 붙이면 된다.

-- 2. 한국에 있는 집을 그대로 복제해서 일본에 만들고 일본 주소지를 새로 부여한다.
ㄴ 그러면 한국 일본 모두에 똑같은 집이 생긴것이다.
ㄴ 클래스명 변수명 = new 클래스명(); 을 통해서 사용하는 것이다.

-- 3. 국제 표준 주소로 등록한다.
ㄴ 어느 나라에서 보내던 등록한 국제 표준 주소로 보내면 집에 도착할 것이다.
ㄴ static으로 정의되면 컴파일시 메모리에 올라가게 되어 참조변수를 사용하여 객체 생성없이 사용가능하다.
----------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------------------------------



* 변수 종류

ㄴ 각각 다른거라 생각하고 기능 중심으로 각각 정리해서 사용해라.
ㄴ 비슷한것끼리 묶고 동일시 하는 식은 틀린거다. 전문 분야이니 기능 중심으로만 명심.

-------------
예시)
'기본형 변수'이면서 '멤버 변수'의 '인스턴스 변수'이다
'참조 변수'이면서 '멤버 변수'의 '클래스 변수'이다
'기본형 변수'이면서 '매개 변수'이면서 '지역 변수'이다
이런 식으로 하나의 변수가 조건에 부합하면 여러 타이틀을 겸할 수 있다는 정도로 정리한다.
-------------




** 데이터 타입에 따른 분류

ㄴ 기본형 변수 : 자료의 실제값을 저장한다. // 논리형, 문자형, 정수형, 실수형
ㄴ 참조 변수 : 값이 저장되어 있는 주소값(정확하겐 @hashcode)을 값으로 갖는다. // String, Scanner, 사용자가 정의한 새로운 클래스 .....




** 선언 위치에 따른 분류




*** 멤버변수 : 동일한 클래스 내에 선언한 변수들의 모음을 말한다.

ㄴ 인스턴스 변수: 객체마다 가지는 고유 변수. 클래스 영역에서 선언되고 인스턴스 생성시 만들어진다.
ㄴ 클래스 변수: 멤버 변수중에 static으로 정의한 변수. 클래스 로딩시 생성되며 값을 공유한다. Math, Helper등에 사용. // 클래스명.변수명




*** 전역 변수 : 전역 변수란 함수의 외부에서 선언된 변수를 의미.

ㄴ 전역 변수는 프로그램의 어디에서나 접근할 수 있으며, 프로그램이 종료되어야만 메모리에서 사라짐.




*** 지역변수 : 지역 변수란 '블록' 내에서 선언된 변수를 의미.

ㄴ 메소드 내에 선언되며 메소드 호출시 생성되고 메소드가 종료되면 사라짐.




*** 매개변수 : 흔히 파라미터라고 불린다. 메소드에서 입력값을 받을 때 사용되는 변수를 매개변수라고 한다.

ㄴ 매개변수도 매소드 내에 선언된 것으로 간주되므로 지역변수이다.
ㄴ 메소드 입력부에 넣는 값이며 이값은 매개변수에 복사되어 대입된다.




** 객체 변수:

ㄴ 객체변수는 인스턴스 변수, 멤버 변수, 속성이라고도 말한다.
ㄴ 클래스에 의해 생성되는 것은 객체, 그리고 그 클래스에 선언된 변수는 객체 변수라고 생각하면 쉽다.
ㄴ 호출: 객체.객체변수
------------------------------------------------------------------------------------------------------------------------------------------------------------




* 데이터 타입

ㄴ 기본타입
ㄴ 레퍼런스 타입
ㄴ 문자형




* 접근 제한자

public : 모든 접근을 허용
protected : 같은 패키지(폴더)에 있는 객체와 상속관계의 객체들만 허용
default : 같은 패키지(폴더)에 있는 객체들만 허용
private : 현재 객체 내에서만 허용




* 컴파일

ㄴ 작성한 데이터가 자바 가상머신에서 구동되는 것
ㄴ main 메소드 // 메모리에 제일 먼저 올라감
ㄴ static : 변수 // 구동할때 클래스 불러올때 메모리에 먼저 올라감
ㄴ final static : 상수 // 구동할때 클래스 불러올때 메모리에 먼저 올라감

※ 총 정리



* 자바 구조

0. Package 1. 클래스

2. 메소드, 변수



* 객체를 구현하기 위해서 필요한것

1. 설계도 -> 클래스
2. 기능/ 속성/ 메모리 -> 인스턴스(객체)