1. 객체지향언어
- 객체 지향 프로그래밍(OOP : Object Oriented Programming)
- 객체들을 먼저 만들고, 이것들을 하나씩 조립하여 완성된 프로그램을 개발하는 기법
- 프로그램을 보다 유연하고 변경이 용이하게 만들고, 코드의 재사용을 통해 반복적인 코드를 최소화해 유지보수 하는데 유리하다.
- 특징
- 추상성 : 사물이나 표상을 어떤 성질,
공통성, 본질에 착안하여 그것을 추출
하여 파악하는 것- 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
- 추상화를 구현하는 문법 요소 : 추상 클래스 / 인터페이스
- 인터페이스 : 어떤 객체의 역할만을 정의하여 객체들 간의 관계를 유연하게 연결하는 역할
- 어떤 객체가 수행해야 하는 핵심적인 역할만을 규정해두고, 실제적인 구현은 해당 인터페이스를 구현하는 각각의 객체들에서 하도록 프로그램을 설계
- 역할과 구현의 분
- 상속 : 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소
- 상위 클래스로부터 확장된 여러 개의 하위 클래스들이 모두 상의 클래스의 속성과 기능들을 간편하게 사용할 수 있도록 한다.
- 공유하는 속성과 기능들을 한번만 정의하고 재사용이 가능해 반복적인 코드를 최소화 하고 공유하는 속성과 기능에 간편하게 접근가능
- 인터페이스 vs 상속
- 인터페이스 : 반드시 인터페이스에 정의된 추상 메서드의 내용이 하위 클래스에서 정의되어야 한다.
- 상속 : 상위 클래스의 속성과 기능들을 하위 클래스에서 그대로 받아 사용하거나 오버라이딩을 통해 선택적으로 재정의하여 사용가능
- 캡슐화 : 클래스 안에 서로 연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것
- 접근 제어자와 getter setter 를 통해 구현 가능
- 사용 이유
- 데이터 보호(getter setter) : 외부로부터 클래스에 정의된 속성과 기능들을 보호
- 데이터 은닉(접근 제어자) : 내부의 동작을 감추고 외부에는 필요한 부분만 노출
- 다형성 : 어떤 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있는 성질
- 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할 수 있는 특성
- 메서드 오버라이딩과 오버로드
- 넓은 범위의 타입, 즉 상위 클래스 타입의 참조 변수(Vehicle)로 관계있는 하위 클래스들(Car, MotorBike)을 참조할 수 있는 능력
- 인터페이스를 통해 간접적으로 연결되어 결합도가 낮아진다.
- 추상성 : 사물이나 표상을 어떤 성질,
2. 클래스와 객체
- 클래스 : 객체의 특징(속성, 기능)을 정해놓은 제품 설계도
- 필드 : 객체의 데이터가 저장되는 곳
- 메서드 : 객체의 동작에 해당하는 실행 블록
- 생성자 : 객체 생성시 초기화 역할 담당
- 객체 : 모든 실재하는 대상
- 객체 지향 프로그래밍의 가장 기본적인 단위이자 시작점
- 속성(state)과 기능(behavior)으로 구분한다
- 이를 variable 과 function으로 정
- 인스턴스 : 클래스에 의해서 만들어진 객체
- 클래스와 객체 선언
- 클래스 네이밍 규칙
작성 규칙 예시 하나 이상의 문자로 이루어져야 한다. Car, SportsCar 첫 번째 글자는 숫자가 올 수 없다. 3Car (x) $ _ 외의 특수문자는 사용할 수 없다. $Car, _Car, @Car (x), #Car (x) 자바 키워드는 사용할 수 없다. int (x), for (x)
- 클래스 네이밍 규칙
3. 클래스의 구성 멤버 살피기(필드, 생성자, 메소드)
- 필드(멤버 변수) :
- 객체의 고유 데이터가 저장되는 곳
- 클래스 전역에서 사용가능
- 객체가 소멸되지 않는 한 객체와 함께 존재하는 변수
- 생성자 :
- new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당
- 생성자 규칙
- 클래스명과 메서드명이 같다
- 리턴 타입을 정의하지 않는다
- 생성자 앞에 접근제어자로 public 혹은 private 모두 올 수 있다.
- 객체 생성 방법이 생성자 규칙과 맞지않는 경우(매개변수가 필요한데 주지 않은 경우), 오류가 발생한다.
- 디폴트 생성자 : 생성자의 입력항목이 없고, 생성자 내부에 아무런 내용이 없는 생성자
- 클래스에 생성자가 하나도 없다면, 컴파일러는 자동으로 디폴트 생성자를 추가한다.
- 하나라도 있다면 디폴트 생성자 추가 X
- 생성자 오버로딩
- 클래스 내에 같은 이름의 함수를 여러개 선언하는 것
- 입력항목이 다른 생성자를 여러개 만드는 것
- 리턴타입이나 입력인자가 다른경우 오버로딩이 발생한다
- 메소드
- 클래스 내에 구현된 함수
리턴타입 메소드이름([매개변수 선언, ...]) { // 선언부 // 실행블록 }
- 리턴타입 : 메소드가 실행 후 리턴하는 값의 타입을 말한다.
- 리턴타입이 있어도 필요하지 않은 경우에 변수에 저장하지 않고 호출할 수 있다.
- 매개 변수 : 메소드에 전달된 입력값을 저장하는 변수
- 인수 : 메서드를 호출할 때 전달하는 입력값
- 메소드 내에서 선언된 변수의 효력 범위 : 메소드 안에서만 사용
public class Calculator { int prefixOperator(int a) { //call by value : return ++a; } public static void main(String[] args) { int a = 1; Calculator calculator = new Calculator(); a = calculator.prefixOperator(a); System.out.println(a); // a = 2로 출력되도록 메소드 수정하기 } }
- this : 객체 자기자신을 가리킬때 사용하는 키워드
- 사용하는 경우
- 생성자와 메소드의 매개변수 이름이 필드와 동일한 경우
- 인스턴스의 필드임을 명시하고자 할 때
public class Calculator { int a; // 필드 a void postfixOperator() { this.a++; // 본인 객체 접근시 this 사용 } public static void main(String[] args) { Calculator cal = new Calculator(); cal.a = 1; cal.postfixOperator(); // Before) cal.postfixOperator(cal); System.out.println(cal.a); } }
- 사용하는 경우
4. final 필드와 상수
- final 필드 : 최종적인 필드
- 초기값 지정이 되면 이것이 최종적인 값이 되어 프로그램 실행 도중에 수정이 불가능하다.
- final 필드의 초기값을 줄 수 있는 방법
- 필드 선언 시
- 생성자에서도 초기화 가능
- 프로그램을 수행하면서 그 값이 바뀌면 안 될 때 사용
public class Person { final String nation = "Korea"; String name; public Person(String name) { this.name = name; } } public class PersonExample { public static void main(String[] args) { Person person = new Person("계백"); System.out.println(person.nation); System.out.println(person.name); person.nation = "을지문덕"; // Error: 컴파일 오류 발생. final 필드는 값 수정 불가 } }
- 상수 (static final) : 불변의 값을 저장하는 필드
- 모두 대문자로 작성
- 여러 단어를 잇는 경우 언더바(_)를 사용
- 객체가 없어도 접근이 가능하다
- final을 상수라고 부르지 않는다
- 상수는 객체마다 저장할 필요가 없는 공용성을 띈다
- 상수는 여러가지 값으로 초기화 할 수 없다.
- static final 필드의 초기값을 줄 수 있는 방법
- 필드 선언 시
- 정적 블록에서 초기화
5. 접근 제어자
- 캡슐화 : 클래스 안의 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것
- private
- 해당 클래스 안에서만 접근이 가능
- default
- 접근 제어자를 별도로 설정하지 않는 경우에 자동으로 설정
- 동일한 패키지 안에서만 접근이 가능
- protected
- 동일 패키지의 다른 클래스에서 접근 가능
- 해당 클래스를 상속받은 외부 패키지의 클래스에서도 접근이 가능
- public
- 어떤 클래스에서도 접근이 가능
- 유일하게 src 폴더 내에 모든 패키지에서 접근 가능
- 클래스는 접근 제어자로 public 과 default 만 허용한다
- default : 동일한 패키지에서만 클래스 접근
- public : 외부 패키지에서도 접근을 허용
6. Getter, Setter 메소드
- 객체 지향 프로그래밍에서 일반적으로 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다
- 객체의 데이터를 외부에서 접근해 수정할 경우, 객체의 무결성이 깨질 수 있다
- 이를 해결하기 위해 메소드를 통해 데이터를 변경하는 방법을 사용한다.
- 데이터는 외부에서 접근할 수 없도록 막고, 메소드는 공개해서 외부에서 메소드를 통해 데이터에 접근하도록 유도
- 메소드가 매개값을 검증해서 유효한 값만 데이터로 저장할 수 있기 때문
- Getter
- 객체 외부에서 객체의 필드값을 사용하기 부적절한 경우, 메소드로 필드값을 가공할 수 있다.
- 필드 타입이 Boolean 인 경우, getter 메소드명을 관례상 get이 아닌 is로 시작한다.
public class Car { private int speed; public double getSpeed() { double km = speed * 1.6; return km; } }
- Setter
- 필드값은 private로 막고, Setter 메소드를 public으로 공개
public class Car { private int speed; public void setSpeed(int speed) { if (speed < 0) { this.speed = 0; return; } else { this.speed = speed; } } }
7. 어노테이션
- 메타데이터 : 애플리케이션이 처리할 데이터가 아닌, 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려주는 정보
- 용도
- 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공
- 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공
- 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공
- 어노테이션 타입 정의와 적용
public @interface AnnotationName { // element를 멤버로 가질 수 있다. // int, double, Stirng, Enum, Class, 이들의 배열타입 // 메소드처럼 ()를 붙여줘야 한다. String elementNameOne(); int elementNameTwo() default 5; } @AnnotationName @AnnotationName(elementNameOne = "값", elementNameTwo = 2); 또는 @AnnotationName(elementNameOne = "값") @AnnotationName("값");
- 디폴트 값이 없는 엘리먼트는 반드시 값을 기술해야 한다.
- 어노테이션 적용 대상
클래스, 필드, 메소드만 어노테이션을 적용할 수 있고 생성자는 적용할 수 없습니다.
ElementType 열거 상수 적용 대상 TYPE 클래스, 인터페이스, 열거타입 ANNOTATION_TYPE 어노테이션 FIELD 필드 CONSTRUCTOR 생성자 METHOD 메소드 LOCAL_VARIABLE 로컬 변수 PACKAGE 패키지 - 적용대상을 지정할때는 @Target 어노테이션을 사용
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD}) public @interface AnnotationName { }
- 적용대상을 지정할때는 @Target 어노테이션을 사용
8. 추가
- Call by value / Call by reference : https://inpa.tistory.com/entry/JAVA-☕-자바는-Call-by-reference-개념이-없다-❓
- 리턴타입만 다른경우
- 리턴타입은 JVM이 메소드를 선택할때 도움을 주지 못한다.
- System.out.println이 대표적인 예
- 혼자 공부하는 자바 264페이지 참조
- 매개 변수의 타입, 순서를 변경하여 같은 이름의 함수를 여러 번 정의가능. ⇒ 단, 메서드이름 앞에 자료형이 달라지면 그건 아예 다른 메서드라고 인식.
- 타입 일치 : 인수의 타입은 함수가 정의한 매개 변수의 타입과 불일치시 오류를 발생 시킬 수 있음.
- 순서 중요 : 인수는 함수가 정의된 매개 변수의 순서에 따라 전달이 필요.
- 객체지향 프로그래밍 추가 설명 : https://www.codestates.com/blog/content/객체-지향-프로그래밍-특징
9. Daily Quiz
'Dev > ESTsoft 오르미' 카테고리의 다른 글
인터페이스 (0) | 2024.02.23 |
---|---|
상속 (0) | 2024.02.23 |
참조자료형 (0) | 2024.02.22 |
연산자 / 조건문과 반복문 (0) | 2024.02.22 |
변수 (0) | 2024.02.22 |