백기선 자바스터디 5주차

<< 총 15주차 까지 진행되며 주어지는 키워드를 가지고 블로그에 정리하며 공부하는 스터디 입니다 ! >>
목표
자바의 Class에 대해 학습하세요.
05주차에서 학습할 것 ?
- 1. 클래스 정의하는 방법
- 2. 객체 만드는 방법 (new 키워드 이해하기)
- 3. 메소드 정의하는 방법
- 4. 생성자 정의하는 방법
- 5. this 키워드 이해하기
자바는 객체지향 언어라고들 합니다.
세상의 모든것을 객체로 표현하고,
그 객체들을 조립해서 프로그램을 완성합니다.
클래스와 객체는 추상적이고 난해해서 선뜻 이해하기가 어려운데 ,
객체라는 용어는 Object 를 번역한 것이고 세상에 존재하는 모든것을 의미합니다.
그냥 물건이라고 생각하면 편해요~
모든 사물은 속성과 동작으로 구성되며 사물기리 관계를 맺으며 세상이 돌아가는데
사람이 자동차를 타고, 노트북을 사용하고, 통장에 입금해서 예금잔고를 증가시킵니다.
객체 지향 방식이란 독립적으로 동작하는 객체를 먼저 만들고 이들을 조립하여 프로그램을 완성해 나가는 방식입니다.
이미 완성된 부품인 객체를 조립하는 방식이기 때문에 생산성이 높고,
유지보수도 효율적이죠 !
부품조립식이라고 생각하면 편합니다
그래서 클래스는 사물을 표현하고 객체를 정의하는 하나의 큰 틀이라고 생각할수 있죠 !
사물의 속성과 동작을 코드로 표현하는 개념인데
먼저 클래스를 선언한 후 클래스로부터 필요한 객체를 찍어냅니다.
클래스로부터 객체를 만들기 때문에
객체의 한단계 위가 클래스 입니다 !!
객체지향의 보편적 특징인
캡슐화, 추상화, 상속, 다형성을 구현하는 주체가 바로 클래스입니다 !
클래스는 관련있는 변수와 메서드를 하나로 묶어놓은것입니다.
배열은 동종타입의 변수 집합을 말하는데
클래스는 이종 타입의 변수를 포함할수 있고
심지어 동작을 표현하는 메서드까지 가집니다.
클래스 선언문은 다음과 같습니다.
[지정자] class 이름 {
필드선언 ;
메소드선언;
}
지정자는 클래스의 추가적인 속성을 정의하며 생략가능 !
1. 클래스 정의하는 방법 ??
클래스란 뭘까요 ?
설계도 !!!
또는 객체를 정의하는 틀의 의미입니다.
이러한 설계도인 클래스를 가지고, 여러 객체를 생성하여 사용하게 됩니다.
클래스의 구성은 ???
객체의 상태를 나타내는 필드 field
객체의 기능을 나타내는 메소드 method
로 구성됩니다.
필드는
클래스에 포함된 변수 !
메소드는
기능을 수행하기 위한 명령문의 집합 ! (묶음) !
정의하는 방법 ?
// 클래스의 정의는 class 키워드를 통해 사용 !
// 클래스가 다른 클래스를 상속하고 있을땐 extend 해서 사용 !
// 하나 이상의 인터페이스를 구현해야 한다면 implements 사용 !
// public , protected, private 등의 접근자 사용 !
// abstract, final, strictfp 를 modifier 라는 키워드를 사용 !
2. 객체 만드는 방법 ??
클래스가 선언 되었나용 ? ?
그렇다면
new 키워드를 통해 인스턴스 생성 !! 하고
해당 인스턴스의 주소를 미리 선언해둔 참조변수에 저장하여 사용할수 있습니다.
<< new 키워드의 과정 detail >>
: 메모리를 새로운 인스턴스에 할당 !
주어진 아규먼트에 따라서 생성자 바디가 호출 됨 !!
- >그 후 초기화 되고 나서 객체가 생성됩니다.
모든 자바 클래스는 하나 이상의 생성자를 가지고 초기화 과정이 있습니다.
만약 의도적으로 생성자를 명시하지 않았다면 ?
javac 컴파일러가 자동적으로 constructor 를 추가해 줍니다 !!
// 개념
객체참조변수이름 = new 클래스이름();
// 예제
myCar = new Car();
객체는 프로그램의 부품이라고 했습니다.
그런데 왜!?!?!?
클래스를 정의한 이후에 객체를 생성하는 걸까요 ?
객체 이전에 클래스라는 장치가 필요한 이유는 딱 2가지 정도로 요약이 가능합니다~
1. 수많은 객체를 효율적으로 찍어내려고 !
2. 같은 종류라는것을 확실하게 하려고 ! !
3. 메소드 정의하는 방법 ??
메소드를 왜 정의할까요 ?
메소드를 정의해야만 하는 이유에 대해 먼저 알아야 정의하는 방법도 이해하기 쉬울거 같습니다.
만약 main메소드에서 1 부터 10 까지의 합계와
15 부터 100까지의 합계를 구해 출력한다고 하면??
1. 변수를 선언하고
2. 루프를 돌려서
3. 합을구하고
합계를 구할때마다 이 작업을 반복한다면
분명 분명 분명 낭비일 것입니다 !
똑같은 작업을 반복하지 않게 하기 위해서 !
이럴때를 위해서 !
별도로 기능이 담긴 하나의 틀을 찍어내는거라고 생각하세요 !!!!
-----메서드를 구성하는 기본 원칙 !!! -----
// 두번이상 반복되는 코드는 메소드로 분리하자 !
// 한번에 하나의 일만 하자 !!
// 작업 단위를 가급적 잘게 쪼개자 !!
// 직관적이고 좋은 메소드이름을 붙여주자 !!
접근제어자 ?
- > 해당 메소드에 접근가능한 범위 입니다 !
반환타입 ?
- > 메소드가 모~~든 작업 마친다음 되돌려줄 데이터 타입종류를 씁니다 !
메소드 명 ?
- > 메소드를 나중에 호출할때 써먹을 이름입니다 !
매개변수 목록 ?? ( 파라미터들 )
- > 메소드 호출할때 전달될 인수값을 저장할 변수들입니다 !
구현부 ??
- > 메소드의 고유 기능을 수행하는 명령문들 모음입니다 !!
4. 생성자 정의하는 방법 ??
클래스를 가지고 객체를 생성하면 어떻게 되나요 ?
뭔일이 생기나요 ???
해당 객체가 메모리에 즉시생성 되겠죠 !!!
근데하지만그치만 이렇게 생성된 객체는 초기화 되지 않은 상태입니다
뭐가?
모든 인스턴스 변수가 초기화 되지 않은 상태입니다.
자바에서 클래스 변수와 인스턴스 변수는 별도로 초기화하지 않으면
자동초기값이 따로 있답니다 ~~~
하지만 사용자가 원하는 값으로 인스턴스 변수를 초기화 하려면?
---> 일반적인 초기화 방식으로는 초기화 할수 없어용 !!
그럼 뭘 어째야하나요 ㅠ
이런 초기화만을 위한 메소드 ~~
그이름이 바로 생성자 입니다 ~!@~~!@~!@~@~@
우와 생성자 대다나당 초기화 만을 위했어~!@~@~!@
중요한거 !!
자바에서 생성자의 이름은 클래스 이름이랑 같아야 합니다.
1. 생성자는 반환값이 없어 ~ 그치만 void 타입선언 안해요~
2. 초기화를 위한 데이터를 인수로 전달받기 쌉가능 ~
3. 객체 초기화 하는 방법이 여러개 존재할땐 ????
하나의 클래스가 여러개의 생성자를 가질수 있습니다 ~!@~!@
이게 뭔뜻인데요 ...?
== 즉, 생성자도 하나의 메소드 이므로, 메소드 오버로딩이 가능하다는 의미입니다 ~!!
5. this 키워드 이해하기 !!
this 가 뭔지 하나도 몰라요 ㅠ
일단 this.는 참조변수 입니다
바로바로 자기 자신을 참조하는데 씁니다 .
그건아는데 그게 뭔솔ㅠ
Car (String modelName, int modelYear, String color, int maxSpeeds) {
this.modelName = modelName;
this.modelYear = modelYear;
this.color = color;
this.currentSpeed = 0;
}
위의 예제처럼
생성자의 매개변수 이름과 인스턴스 변수의 이름이 같을 경우에!!!!?!??!
그때 그때 이제 인스턴스 변수 앞에
this 키워드를 붙여서 구분해야만 합니다.
이렇게 자바에서는 this 참조변수가 숨겨진 지역변수로 존재하고 있습니다 !@#!@#!@#
this()메소드는 언제만 사용가능할까요 ?
1. 생성자 내부에서만 사용할수 있으며,
2. 같은 클래스의 다른 생성자를 호출할때 사용합니다 !
this() 메소드에 인수를 전달하면,
생성자 중에서 메소드 시그니처가 일치하는 다른 생성자를 찾아 호출해 줍니다 !