객체지향 어렵다
전체적인 컨셉 파악하는 것이 중요!
다면성 (다양한 면이 있다)
Object-Oriented Programming (OOP)
객체는 속성(state)과 기능(behavior)의 집합
속성은 필드(변수)로, 기능은 메서드로 정의
클래스 : 객체를 정의한 설계도. 붕어빵틀 (객체: 실제 제품. 오브젝트라고도 함. 붕어빵). 클래스 ≠ 객체
인스턴스 : 클래스로부터 만들어진 객체. (인스턴스화: 객체를 만드는 과정)
[클래스]
class ClassName { // 클래스 이름은 대문자로 시작
int x = 값; // 필드 (클래스의 속성)
void print // 메서드 (클래스의 기능)
ExClass // 생성자 (클래스의 객체 생성)
class ExClass2 // 이너 클래스 (클래스 내부의 클래스)
} // 클래스의 멤버 : 필드, 매서드, 이너클래스
객체 생성
클래스명 참조변수명; // 인스턴스를 참조하기 위한 참조변수 선언
참조변수명 = new 생성자(); // 인스턴스 생성 후, 객체의 주소를 참조 변수에 저장
// 또는 한 줄로 표현 가능
클래스명 참조변수명 = new 생성자();
객체 활용
참조변수명.필드명 // 필드값 불러오기
참조변수명.메서드명() // 메서드 호출
참고 사이트
[클래스]
http://wiki.hash.kr/index.php/%ED%81%B4%EB%9E%98%EC%8A%A4
https://en.wikipedia.org/wiki/Class_(computer_programming)
[객체]
http://wiki.hash.kr/index.php/%EA%B0%9D%EC%B2%B4
https://en.wikipedia.org/wiki/Object_(computer_science)
[필드]
클래스에 포함된 변수. 객체의 속성 정의
변수 (클래스, 인스턴스, 지역) 중 클래스 변수(static O)와 인스턴스 변수(static X) 를 필드라고 부름
class Example { // 클래스 영역
int 상수변수이름; // 인스턴스 변수
static int 상수변수이름2 // 클래스 변수 (static 변수, 공유 변수)
void 메서드이름() { // 메서드 영역
int 상수변수이름3 = 0; // 지역변수. {} 블록 안에서만 유효
}
}
인스턴스 변수(iv) : new 생성자() .객체 고유의 개별성. 강제 초기화
클래스 변수(cv) : static 사용. 공통된 저장공간 공유. 클래스명.클래스변수명 으로 클래스 변수 사용 가능. 강제 초기화
지역변수(lv) : 메서드 내에서만 사용가능. 직접 초기화
static
클래스의 멤버(필드, 메서드, 이너 클래스)에 사용. 정적 멤버 (<-> 인스턴스 변수).
static 사용시 변수(new) 지정 않고도 클래스명.멤버명 으로 사용 가능
public class StaticTest {
public static void main(String[] args) {
StaticExample staticExample = new StaticExample();
System.out.println("인스턴스 변수: " + staticExample.num1); // 인스턴스 변수: 10. 포인트 연산자 사용
System.out.println("클래스 변수: " + StaticExample.num2); // 클래스 변수: -10. 객체 생성 없이 클래스명 사용
}
}
class StaticExample {
int num1 = 10;
static int num2 = -10;
정적 필드는 객체 간 공유 변수 적용 (메서드 앞에 사용시 정적 메서드로)
정적 메서드는 인스턴스 변수/메서드 사용 불가
public class StaticFieldTest {
public static void main(String[] args) {
StaticField staticField1 = new StaticField(); // 객체 생성
StaticField staticField2 = new StaticField();
staticField1.num1 = 100;
staticField2.num1 = 1000;
System.out.println(staticField1.num1); // 100
System.out.println(staticField2.num1); // 1000
staticField1.num2 = 150;
staticField2.num2 = 1500;
System.out.println(staticField1.num2); // 1500
System.out.println(staticField2.num2); // 1500 (static 사용하여 공통값 적용)
}
}
class StaticField {
int num1 = 10; // 인스턴스 필드
static int num2 = 15; // 정적 필드
static은 클래스 멤버 앞에 사용 가능 ( 필드, 메서드, 이너클래스). 이를 정적 멤버라고 함.
정적 멤버는 따로 인스턴스 생성하지 않고도 클래스 명으로 변수나 메서드 호출 가능.
클래스 메서드에서 클래스 변수 접근 가능
클래스 메서드에서 인스턴스 변수 접근 불가
-> 참조 불가 에러메세지. (참조 하려면 메모리 어딘가 인스턴스 있어야 함- Car car = new Car(); )
참고 사이트
http://wiki.hash.kr/index.php/%ED%95%84%EB%93%9C_(%EC%9E%90%EB%B0%94)
https://jenkov.com/tutorials/java/fields.html#:~:text=A%20Java%20field%20is%20a,position
[메서드]
객체의 기능을 정의
특정 작업을 수행하는 일련의 명령문들의 집합
메서드 시그니처와 메서드 바디로 구분
자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
메서드 내용 // 메서드 바디
}
반환 타입 : 해당 메서드가 어떤 타입을 반환하는가 (void는 return문 필요 없음. void 아니면 return문 필요)
메서드명 : 소문자로 표시
매개 변수 : 해당 작업을 수행하기 위해 어떤 재료가 필요한가
[메서드 호출]
클래스 외부에서 메서드 사용 위해 인스턴스 생성해야 -> 포인트 연산자(.) 사용
클래스 내부에서는 따로 객체 생성하지 않고도 서로 호출 가능
void printHello()j {
System.out.println("hello!")
}
메서드 이름(매개변수1, 매개변수2, ... ); // 메서드 호출방법. 매개 변수 없을수도 있음
void printHello(); // 위의 코드 호출. hello! 출력
메서드 호출 시 괄호() 안에 넣어주는 입력 값 (인자 argument) 개수와 순서 반드시 메서드 정의할 때의 매개변수와 일치해야! (일치하거나 자동 형변환이 가능해야)
[메서드 오버로딩]
하나의 클래스 안에 같은 이름의 메서드를 여러개 정의. 같은 이름의 메서드로 여러 기능 구현 가능
(같은 이름의 메서드명, 매개변수의 개수나 타입이 다르게 정의)
public class Overloading {
public static void main(String[] args) {
Shape s = new Shape(); // 객체 생성
s.area(); // 메서드 호출
s.area(5);
s.area(10,10);
s.area(6.0, 12.0);
}
}
class Shape {
public void area() { // 메서드 오버로딩. 같은 이름 메서드 4개
System.out.println("넓이"); // 넓이
}
public void area(int r) {
System.out.println("원 넓이 = " + 3.14 * r * r); // 원 넓이 = 78.5
}
public void area(int w, int l) {
System.out.println("직사각형 넓이 = " + w *l); // 직사각형 넓이 = 100
}
public void area(double b, double h) {
System.out.println("삼각형 넓이 = " + 0.5 * b * h); // 삼각형 넓이 = 36.0
}
}
오버로딩 성립 조건 : 같은 메서드명, 다른 매개변수 개수/타입
오버로딩 장점 : 하나의 메서드로 여러 경우의 수 해결 가능 (-> 후에 다형성)
참고 사이트
http://wiki.hash.kr/index.php/%EB%A9%94%EC%86%8C%EB%93%9C
https://jenkov.com/tutorials/java/methods.html
개발자는 문제를 해결하는 사람, 새로운 것을 창조하는 사람
-> 어떤 문제를 마주했고 어떻게 해결해 나갔는지가 가장 중요하다
이런 에러 핸들링 로그 꼭 꼭 기록해놓기!
TIL (Today I learned)
회고
좋았던 점, 문제점. 좋은 점 어떻게 더 발전시킬것인지, 문제 어떻게 해결해 나갈 것 인지?
자기 객관화를 통해 더 빠르게 성장할 수 있다
기록하고 잊어라.
잊을 수 있는 기쁨을 만끽하면서
항상 머리를 창의적으로 쓰는 사람이 성공한다.
그 비결은 바로 메모 습관에 있다
명언 하루에 하나씩 찾아 보기
좋은 습관 만들기 : 3개월동안 똑같은 행동 반복하기