객체(Object)란?
우리 주변에 있는 모든 것으로 프로그래밍 대상 (Ex-물체, 집, 사람, 자동차, 등)
※Object(오브젝트) == instance(인스터스)
객체지향 프로그래밍
주변에 있는 모든 것을 객체화해서 프로그래밍을 하는 것
객체지향 프로그래밍의 장점
1) 블록 형태의 모듈화 된 프로그래밍
- 신뢰성 높은 프로그래밍이 가능
- 코드 재사용성이 높다
- 소프트웨어 유지 보수할 때 유리하다.
2) 현실 세계에 비유하여 쉬운 프로그래밍 가능
- 주변의 모든 것들을 객체(Object)로 표현
- 소프트웨어의 동작은 객체들의 상호 작용 묘사로 구현 가능
클래스(Class)
- 객체를 정의해 놓은 것 (객체의 설계도)
- 클래스는 직접 사용할 수 없고, 직접 사용하기 위해서는 객체를 생성
객체(Object, instance)
- 클래스를 구체화(New)하면 프로그램의 객체 생성
- 클래스를 데이터 타입으로 해서 메모리에 생성한 것
메서드(Method)
int order(String, foodNamem, int count) //선언부
{
//구현부 시작
System.out.println(name+ "남자가" + foodName + " " + count + "가지 주문");
return count;
//구현부 끝
}
- 현실의 객체를 하는 동작(기능)
- 어떤 작업을 수행하는 코드의 집합
- 외부의 값을 전달 받음 Argument==파이썬 파라미터(parameter)
- 구현부의 코드를 실행하고 return 키워드를 통해 결과 값을 돌려주는 역할
메서드 사용하는 이유
- 반복적으로 사용되는 코드의 중복 방지
- 코드의 양을 줄일 수 있고 유지 보수에 유리
현업에서는 같은 의미를 다르게 호칭 할때 있음
객체 - 오브젝트(Object), 인스턴스(instance)
속성 - 필드(Field), 멤버 변수
기능 - 메서드(Method), 메소드, 함수
메서드 오버로딩(Method Overloading)
동일한 기능을 수행하는 메서드의 추가 작성
적용 조건
- 메서드 이름이 동일(필수)
- Argument의 개수가 다른 경우
- Argument의 데이터 타입이 다른 경우
※오버로딩과 오버라이딩 차이
생성자(Constructor)
- 객체를 생성할 때 new 키워드와 함께 호출하는 리턴 타입 없는 메서드
- 객체 생성 시 실행해야 하는 코드를 생성자에 작성
- 필드 초기화
- 보통 메서드와 마찬가지로 Argument를 통해 데이터 전달 가능
기본 생성자(Default Constructor)
- 생성자가 하나도 없다면, Argument가 없는 생성자를 자동으로 만든다.
- 생성자가 하나 이상 존재하면, 기본 생성자는 만들지 않는다.
상속 (Inheritance)
- 기존 클래스의 자산(필드, 매서드)을 자식 클래스에서 재사용 ※단, 부모클래스의 생성자와 초기 블록은 상속X 호출O
- 기존 클래스의 자산을 물려 받기 때문에 코드를 줄일 수 있다. ※부모 클래스의 코드를 변경하면 모든 자식클래스 적용
- 모든 클래스의 부모 클래스는 extends Object가 생략됨 ※자바 컴파일러가 자동으로 기입함
- 모든 클래스에는 Object에 정의된 메서드가 있음 ※hashCode, equals, toString
- 상속 관계(is a)로 표현
단일 상속(Single Inheritance)
- 자바는 단일 상속만 지원 ※두가지이상 상속 X,
- 다중 상속의 효과를 내고 싶다면 interface 또는 포함 관계(has a)로 구현 가능
메서드 오버라이딩(Overriding)
조상 클래스에 정의된 메서드를 자식 클래스에서 적합하게 수정
※대충 재정의 느낌
오버라이딩 조건
- 메서드 이름,선언부가 같아야 한다.
- Argument의 개수, 타입, 순서가 같아야 한다.
- 리턴 타입이 같아야 한다.
- 접근 제한자는 부모보다 범위가 넓거나 같아야 한다.
- 조상보다 더 큰 예외를 던질 수 없다.
※JDK 1.5부터는 @Override annotatior 제공
- 컴파일러에게 해당 메서드는 Override한 메서드 임을 알려줌
- Override한 메서드인지 확인하는 방법은 @Override를 메서드 위에 작성해 보면됨
- 위 어노테이션을 선언한 메서드가 오버라이드 되었다는 것을 나타냄.
- 만약 상위(부모) 클래스 및 인터페이스에서 해당 메서드를 찾을 수 없다면, 컴파일 에러를 발생
Object 클래스 메서드 Overriding 3가지
1)toString 메서드
- 객체를 문자열로 표현하는 메서드
- toString 메서드를 재정의하여 System.out.println() 메서드 등에 활용
2)equals 메서드
- 두 객체가 같은지를 비교하는 메서드
- equals 메서드 구현부에 특정 조건을 만족하는 경우를 두 객체가 같다고 재정의하여 비교문에 활용
- primitive 타입과 다르게 비교 기준이 명확하지 않으므로 비교 기준을 재정의
- equals 메서드를 재정의할 때는 반드시 hashCode도 재정의
3)hashCode 메서드
- 객체의 해시 코드 : 시스템에서 객체를 구별하기 위해 사용되는 정수 값
- HashSet, HashMap 등에서 객체의 객체의 동일성을 확인하기 위해 사용
- 미리 작성된 String 이나 Number 등에서 재정의된 hashCode 활용 권장
Super 키워드
- 부모 클래스의 필드, 메서드에 접근하기 위해 사용
- 객체 생성시 자동으로 생성
- 자식 클래스의 생성자 첫 줄에 super 생성자 호출 가능
this 키워드
- 객체 자신의 필드, 메서드에 접근하기 위해 사용
- 객체 자신의 하나의 생성자에서 다른 생성자 호출 가능
class Parent {
String x = "parent";
}
class Child extends Parent {
String x = "child";
void method() {
String x = "method";
System.out.println("x : " + x);
System.out.println("this.x : " + this.x);
System.out.println("super.x : " + super.x);
}
}
public class ScopeTest {
public static void main(String[] args) {
Child child = new Child();
child.method();
}
}
제한자(modifier)
클래스, 변수, 메서드 선언부에 함께 사용되어 부가적인 의미 부여
접근 제한자(Access Modifier)
- Public(어디든 접근가능)
- Protected(상속관계만)
- Default=package (같은 패키지)
- Privte(자기 자신 클래스 내부)
※하나의 대상에 여러 제한자를 조합 가능하나 접근제한자는 하나만 사용 가능
※순서는 상관없음 (일반적으로 접근 제한자를 맨 앞에 작성)
사용 제한자 (Usage Modifier)
- Static: 클래스(메모리 클래스 영역) 레벨의 요소 설정 (프로그램되면 Static영역을 메모리 적재함)
- Final : 요소를 더 이상 수정할 수 없게함 (final class/상속 안됨, final method/Override 안됨, final variable/변수 값 수정 안됨)
- Abstract : 추상 메서드 및 추상 클래스 작성
캡슐화(Encapsulation)
데이터 은닉과 보호
Singleton 디자인 패턴
- 우리가 작성 프로그램에서 오로지 하나의 객체만 생성하고 싶을때 사용
- 외부에서 생성자에 접근 금지(생성자의 접근 제한자를 private으로 설정)
- 내부에서는 private에 접근 가능하므로 직접 객체 생성 (객체 담을 필드 하나를 private으로 설정)
- 외부에서 private 필드에 접근 가능한 getter 생성
- 객체 생성없이 외부에서 접근할 수 있도록 getter와 변수에 static 추가
- 외부에서는 언제나 getter를 통해 객체를 참조하므로 하나의 객체 재사용
다형성(polymorphism)
- 다형성 : 하나의 객체가 많은형(타입)을 가질수 있는 성질
- 상속 관계에 있을때 부모 클래스의 타입으로 자식 클래스 객체를 참조
추상 클래스 (abstract)
- 클래스에 구현부가 없는 메서드가 있으므로 객체를 생성할 수 없음
- 상위 클래스 타입으로써 자식 클래스를 참조할 수는 있다.
- 클래스 내부에 abstract 메서드가 있는 상황이므로 자식 클래스를 abstract클래스로 선언
- 혹은 abstract 메서드를 자식 클래스에서 재정의 하여야 한다
- 자식 중에 꼭 한명은 상속 받아 사용해야하는 자산
참조형 객체의 형 변환
작은 집(자식 클래스)에서 큰 집(부모 클래스)으로 이사 - 묵시적 Type Casting
- 자식 타입의 객체를 부모 타입으로 참조: 형 변환 생략 가능
- 부모 클래스의 모든 내용이 자식 클래스에 존재하기 때문에 가능
큰 집(부모 클래스)에서 작은 집(자식 클래스)으로 이사 - 명시적 Type Casting
- 부모 타입을 자식 타입으로 참조: 형 변환 생략 불가
객체 생성과 메모리
JVM(Java Virtual Machine)의 메모리 구조
※main()메서드는 가상머신(JVM)이 실행
Class 영역
클래스 정보 저장 영역
- Field 정보
- Method 정보
- 타입 정보
- 상수 풀(Constant Pool)
- Static
Stack 영역
Method 실행 영역
- 메서드 호출 순서대로 쌓이는 구조(Stack)
- 메서드 프레임에 로컬변수도 쌓이는 구조
- 로컬변수는 선언된 영역을 벗어나면 삭제
Heap영역
객체를 저장하는 영역 (New로 생산)
- 생성된 객체는 프로그래머가 삭제할 수 없고 GC(Garbage Collection)가 사용하지 않는 객체를 자동탐지해서 삭제 (삭제하는 시점은 아무도 모름)
Static initialize block
프로그램이 실행 되었을때, 딱, 한번 호출
Instance initialize block
객체가 처음 생성 되었을때, 호출
'JAVA' 카테고리의 다른 글
자바 컬렉션 프레임워크(Collection Framework) (0) | 2022.01.19 |
---|---|
자바 제네릭(Generics) (0) | 2022.01.19 |
자바 예외 처리 (0) | 2022.01.19 |
인터페이스 (0) | 2022.01.19 |
JAVA 배열(Array) (0) | 2022.01.13 |