객체 지향 언어
- 현실세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며, 발생하는 모든 사건들은 객체간의 상호작용으로 이 개념을 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어
자바에서의 객체(Object)
클래스에 정의된 내용대로 new연산자를 통해 메모리 영역에 생선된 것
클래스
클래스의 등장 배경
- 객체의 특성에 대한 정의를 한 것으로 캡슐화를 통해 기능을 포함한 개념,사물이나 개념의 공통 요소를 추상화(abstraction)하여 정의
- ex) 제품의 설계도, 빵 틀
추상화(abstraction)
- 유연성을 확보하기 위헤 구체적인 것은 제거한다는 의미
- 프로그램에서 필요한 공통점을 추출하고, 불필요한 공통점을 제거하는 과정
추상화 예시
![](https://velog.velcdn.com/images/jaehoon7368/post/38dd6547-37cb-494c-8747-d30663b667d6/image.png)
public class Member {
private String memberName;
private int age;
private char gender;
private String phone;
private String email;
}
객체
- 현실에 존재하는 독립적이면서 하나로 취급되는 사물이나 개념으로 객체 지향 언어에서 객체의 개념은 클래스에 정의된 내용대로 메모리에 할당된 결과물(Object)
![](https://velog.velcdn.com/images/jaehoon7368/post/ef20cd96-f88a-4905-af9d-2eb072967725/image.png)
객체(Instance)의 할당
- new 연산자와 생성자를 사용하여 객체 생성 시 heap 메모리 공간에 서로 다른 자료형의 데이터가 연속으로 나열/할당된 객체 공간
캡슐화
캡슐화 원칙
- 클래스의 맴버 변수에 대한 접근 권한은 private을 원칙으로 한다.
- 클래스의 맴버 변수에 대한 연산처리를 목적으로 하는 함수들을 클레스 내부에 작성한다.
- 맴버 함수는 클래스 밖에서 접근할 수 있도록 publi으로 설정한다.
클래스
클래스 선언
![](https://velog.velcdn.com/images/jaehoon7368/post/efddc98c-9ae9-4478-965c-035dde106d0e/image.png)
public class Student {
private String name;
private char gender;
private int age;
public Student() {}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setGender(char gender) {
this.gender = gender;
}
public char getGender() {
return this.gender;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
}
필드(Field)
필드 접근제한자
![](https://velog.velcdn.com/images/jaehoon7368/post/bef13dbb-e15d-46f6-9b57-b08f55702017/image.png)
- public : 어디서든 접근 가능
- protected : 같은 패키지에서 접근 가능. 자식클래스인 경우, 다른 패키지에서도 접근 가능
- default(package) : 아무것도 작성하지 않은 경우. 같은 패키지에서 접근 가능
- priavte : 해당클래스 밖에서 직접 접근 불가 (getter,setter 사용하여 간접접근)
필드 예약어 - static
- 같은 타입의 여러 객체가 공유할 목적의 필드에 사용하며,프로그램 start시에 정적 메모리 영역에 자동 할당되는 멤버에 적용
- static 표현식
public class Academy{
private static int temp;
}
필드 예약어 - final
- 하나의 값만 계속 저장해야 하는 변수에 사용하는 예약어
- final 표현식
public class Academy{
private fianl int temp = 100;
}
필드(Field) - 초기화 블럭
인스턴스 블럭({})
- 인스턴스 변수를 초기화 시키는 블럭으로 객체 생성시 마다 초기화
static(클래스)블럭(static{})
- static필드를 초기화 시키는 블럭으로 프로그램 시작 시 한 번만 초기화
![](https://velog.velcdn.com/images/jaehoon7368/post/1aa7778d-99ca-4411-a0db-6e5331da89eb/image.png)
필드(Field) - 초기화 순서
- 클래스 변수 : JVM 기본값 -> 명시적 초기값 -> 클래스 초기화블록 초기값
- 인스턴스 변수 : JVM기본값 -> 명시적 초기값 -> 인스턴스 초기화 블럭 초기값 -> 생성자를 통한 초기값
전역변수
- 클래스 영역에 작성
- 여러 메소드에서 사용가능
- 클래스변수 Class Variable static변수
- static키워드가 있다. 공유목적
- 클래스당 하나만 선언.
- 클래스명.클래스변수 (객체를 통해 접근하지 않는다.)
인스턴스 변수
- Instance Variable non-static변수 멤버변수
- static키워드가 없다.
- 생성된 객체(instance)마다 선언.
- 객체참조변수.필드명
지역변수
- 메소드 영역에 작성(매개변수도 지역변수다.)
- 메소드 내부에서만 사용가능
변수별 생명주기(Life Cycle)
- 지역변수 : 메소드 호출시 ~ 메소드 리턴시
- 인스턴스변수 : 객체생성시 ~ 객체제거시(GC)
- 클래스변수 : 해당클래스최초사용시 ~ 프로그램종료시
getter
- 필드를 제어하는 기본메소드
- 필드값을 제공하는 메소드
- public 필드타입 get필드명(){ return 필드값; }
setter
- 필드를 제어하는 기본메소드
- 필드값을 설정하는 메소드
- public void set필드명(필드타입 변수) { this.필드 = 변수; }
예제
public static final double WIDTH = 5.7;
public static final double HEIGHT = 17.3;
private String owner;
private String number;
public String getOwner() {
return this.owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String number() {
return this.number;
}
public void setNumber(String number) {
this.number = number;
}
생성자(Constructor)
- 객체가 new연산자를 통해 Heap메모리 영역에 할당될 때 객체 안에서 만들어지는 필드 초기화
- 생성자는 일종의 메소드로, 전달된 초기 값을 받아서 객체의 필드에 기록
- 생성자의 선언은 메소드 선언과 유사하나 반환 값이 없으며
생성자명을 클래스명과 똑같이 지정해주어야 함
생성자 표현식
![](https://velog.velcdn.com/images/jaehoon7368/post/e612845b-e704-4bd5-b894-f21647d9a368/image.png)
기본 생성자
- 작성하지 않은 경우, 클래스 사용 시
JVM이 자동으로 기본 생성자 생성
- 상속 시 자식객체에서 부모생성자를 호출. 없으면 오류!
매개변수 생성자
- 객체 생성시 전달받은 값으로 객체를 초기화 하기 위해 사용
매개변수 생성자 작성 시 JVM이 기본 생성자를 자동으로 생성해주지 않음
- 상속에서 사용 시 반드시 기본 생성자를 작성
- 오버로딩을 이용하여 작성
오버로딩
- 한 클래스 내에 동일한 이름의 메소드를 여러개 작성하는 기법
- 동일한 기능을 수행하는데, 매개변수의 타입을 다르게 제공해야 할때 사용
오버로딩 조건
- 메소드이름이 같고 매개변수 선언부(개수, 타입, 순서)가 어떻게든 달라야 한다.
- 매개변수명, 접근제한자, 리턴타입은 개의치 않는다.
public void test() {}
public void test(int a) {}
public void test(int a, int b) {}
public void test(String str) {}
public void test(String str, int x) {}
public void test(int x, String str) {}
메소드(Method)
- 수학의 함수와 비슷하며 호출을 통해 사용
- 전달 값이 없는 상태로 호출하거나 어떤 값을 전달하여 호출
- 함수 내에 작성된 연산 수행 후 반환 값/결과 값은 있거나 없을 수 있음
![업로드중..]()
인스턴스메소드
- non-static 메소드
- 멤버메소드
- 인스턴스변수/클래스변수 모두 사용이 가능
- 현재객체를 의미하는 숨은 this참조변수를 가진다.
클래스메소드
- static 메소드
- 객체를 만들지 않고, 클래스명.test()으로 호출!
- 클래스변수만 접근 가능
- this 참조변수가 없다.
재귀함수 메소드
- 스스로를 다시 호출하는 메소드
- 반복호출을 통해 효율적인 코드작성이 가능하다.
- 종료조건을 제시하지 못하면 무한반복으로 인해 StackOverflowError발생