<<자바>>
오버로딩
함수가 하나의 기능만을 구현하는 것이 아닌 하나의 메서드 이름으로 여러 기능을 구현하도록 하는 java 기능
한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도, 매개변수의 개수 또는 타임, 순서가 다르다면 이름을 사용해서 메서드를 정의할 수 있다
- 오버로딩의 조건
- 메서드의 이름이 같고, 매개변수의 개수, 타입, 순서가 달라야 한다
- '응답 값만' 다른 것은 오버로딩을 할 수 없다
- 접근 제어자만 다른 것도 오버로딩을 할 수 없다
- 결론, 오버로딩은 매개변수의 차이로만 구현할 수 있다
-기본형 매개변수 = 읽는것만 가능
- 매개변수의 타입이 기본형일 때는 값 자체가 복사되어 넘어가기 때문에 매개값으로 지정된 변수의 원본 값이 변경되지 않음
- 메서드를 호출할 때 전달할 매개값으로 지정한 값을 메서드의 매개변수에 복사해서 전달
-참조형 매개변수= 읽고 변경하는것 가능
- 매개변수를 참조형으로 선언하면 값이 저장된 곳의 원본 주소를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경하는 것도 가능
- 메서드의 매개변수뿐만 아니라 반환 타입도 참조형이 될 수 있다
- 반환 타입이 참조형이라는 것은 반환하는 값의 타입이 “실제 값의 주소”라는 의미
- 메서드를 호출할 때 전달할 매개값으로 지정한 값의 주소를 매개변수에 복사해서 전달
멤버 = 필드+ 메서드
인스턴스 멤버 = 인스턴스 필드+ 인스턴스 메서드
클래스 멤버= 클래스 필드+ 클래스 메서드
필드와 메서드는 선언하는 방법에 따라 인스턴스 멤버와 클래스 멤버로 구분
인스턴스 멤버는 객체 생성 후에 사용, 클래스 멤버는 객체 생성 없이도 사용
static으로 선언해 논 메서드는 인스턴스화 안 시켜도 된다 언제든 호출 가능
클래스는 이름으로 호출하는게 좋음
지역변수<->전역변수
메서드 내부에 선언한 변수를 의미
메서드가 실행될 때마다 독립적인 값을 저장하고 관리
지역 변수는 메서드 내부에서 정의될 때 생성되어 메서드가 종료될 때까지만 유지
public int getNumber() {
int number = 1; // 지역 변수
number += 1;
return number; // 메서드 종료되면 지역변수 제거됨
상수
- 상수의 특징은 값이 반드시 한 개이며 불변의 값을 의미합니다.
- 따라서 인스턴스마다 상수를 저장할 필요가 없습니다.
- 보통 대문자로 쓰여서 대문자면 상수라고 생각 ex)string TEST-VALUE
final은 ‘최종적’ 이라는 의미
- final 필드는 초기값이 저장되면 해당값을 프로그램이 실행하는 도중에는 절대로 수정할 수 없음
- 또한 final 필드는 반드시 초기값을 지정해야 한다
생성자(=constnetoo)
생성자는 객체가 생성될 때 호출되서 객체를 초기화하는 역활을 수행
public Car() {} // 선언
...
Car car = new Car(); // 호출
기본생성자
기본 생성자는 선언할 때 괄호( ) 안에 아무것도 넣지 않는 생성자를 의미합니다.
- 모든 클래스는 반드시 생성자가 하나 이상 존재합니다.
- 만약 클래스에 생성자를 하나도 선언하지 않았다면 컴파일러는 기본 생성자를 바이트코드 파일에 자동으로 추가시켜줍니다. 따라서 이러한 경우는 기본 생성자 생략이 가능합니다.
- 반대로 단 하나라도 생성자가 선언되어 있다면 컴파일러는 기본 생성자를 추가하지 않습니다.
오버로딩
생성자를 통해 필드를 초기화할 때 오버로딩을 적용할 수 있습니다.
- 예를 들어 우리가 자동차를 생성할 때 모델, 색상, 가격이 다른 자동차를 여러 대 생성할 수도 있고 색상만 다른 자동차를 여러 대 생성할 수도 있기 때문에 오버로딩을 사용하면 이를 효율적으로 처리할 수 있습니다.
⚠️ 여기서 주의할 점이 있습니다!
- 오버로딩을 할 때 개수, 타입, 순서가 동일한데 매개변수명만 다르게 하는 경우는 오버로딩 규칙에 위배되기 때문에 오류가 발생합니다!
public Car(String modelName, String colorName, double priceValue)
public Car(String colorName, String modelName, double priceValue)
- modelName과 colorName 매개변수의 위치가 다르기 때문에 가능할 것처럼 보이지만
- String, String, double : 매개변수의 개수, 타입, 순서가 동일하기 때문에 중복이 불가능합니다.
접근 제어자
제어자는 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여
하나의 대상에 여러 개의 제어자를 조합해서 사용할 수 있으나, 접근 제어자는 단 하나만 사용할 수 있습니다.
- 접근 제어자 : public, protected, default, private
- 그 외 제어자 : static, final(상수선언할때), abstract(추상화할때)
클래스, 멤버 변수, 메서드, 생성자에 사용되고, 지정되어 있지 않다면 default
- public : 접근 제한이 전혀 없음
- protected : 같은 패키지 내에서, 다른 패키지의 자손 클래스에서 접근이 가능
- default : 같은 패키지 내에서만 접근이 가능
- private : 같은 클래스 내에서만 접근이 가능
사용 가능한 접근 제어자
- 클래스 : public, default
- 메서드 & 멤버 변수 : public, protected, default, private
- 지역변수 : 없음
Getter 와 Setter
직접적인 값의 조회,세팅 방지하기 위해 Getter, Setter 사용
이때 외부에서 필드에 직접 접근하는 것을 막기 위해 필드에 private, default 등의 접근 제어자를 사용할 수 있음
객체의 private 필드를 읽어오거나 저장->Getter 와 Setter를 사용
객체의 무결성 즉, 변경이 없는 상태를 유지하기 위해 접근 제어자를 사용
Getter
private double speed; // 자동차 속도 , km/h
private char gear = 'P'; // 기어의 상태, P,R,N,D
private boolean lights; // 자동차 조명의 상태
자동차 클래스의 필드에 이처럼 private 접근 제어자로 지정한 필드가 있을 때 Getter 메서드를 통해 값을 가져올 수 있다
public String getModel() {
return model;
}
public String getColor() {
return color;
}
public double getPrice() {
return price;
}
- 메서드 이름의 규칙: get + 필드 이름(첫 글자 대문자)
- 사용하는 방법은 인스턴스 메서드 호출과 동일
- 외부에서 객체의 private 한 필드를 읽을 필요가 있을 때 Getter 메서드를 사용
Setter
private double speed; // 자동차 속도 , km/h
private char gear = 'P'; // 기어의 상태, P,R,N,D
private boolean lights; // 자동차 조명의 상태
- 자동차 클래스의 필드에 이처럼 private 접근 제어자로 지정한 필드가 있을 때 Setter 메서드를 통해 값을 저장하거나 수정 가능
public void setModel(String model) {
this.model = model;
}
public void setColor(String color) {
this.color = color;
}
public void setPrice(double price) {
this.price = price;
}
- 메서드 이름의 규칙은 : set + 필드 이름(첫 글자 대문자)
- 사용하는 방법은 인스턴스 메서드 호출과 동일
- 외부에서 객체의 private 한 필드를 저장/수정할 필요가 있을 때 Setter 메서드를 사용
제어자의 조합
- 사용 가능한 제어자
- 클래스 : public, default, final, abstract
- 메서드 : public, protected, default, private, final, abstract, static
- 멤버 변수 : public, protected, default, private, final, static
- 지역변수 : final
제어자 사용 시 주의 사항
- 메서드에 static과 abstract를 함께 사용할 수 없다
- 클래스에 abstract와 final을 동시에 사용할 수 없다.
- abstract메서드의 접근 제어자가 private일 수 없다.
- 메서드에 private와 final을 같이 사용할 필요는 없다.
상속
상속의 사전적 정의는 부모가 자식에게 물려주는 행위
객체 지향 프로그램에서도 부모 클래스의 필드와 메서드를 자식 클래스에게 물려줄 수 있다
상속을 사용하면 적은 양의 코드로 새로운 클래스를 작성할 수도 있고 공통적인 코드를 관리하여 코드의 추가와 변경이 쉬워질 수도 있음
이러한 특성 때문에 상속을 사용하면 코드의 중복이 제거되고 재사용성이 크게 증가하여 생산성과 유지 보수성에 매우 유리
다형성
부모 클래스로부터 상속받은 메서드의 내용을 재정의 하는 것을 오버라이딩
- 부모 클래스의 메서드를 그대로 사용 가능하지만 자식 클래스의 상황에 맞게 변경을 해야 하는 경우 오버라이딩을 사용
- 오버라이딩을 하기 위해서는 아래 조건들을 만족해야 합니다.
- 선언부가 부모 클래스의 메서드와 일치해야 합니다.
- 접근 제어자를 부모 클래스의 메서드 보다 좁은 범위로 변경할 수 없습니다.
- 예외는 부모 클래스의 메서드 보다 많이 선언할 수 없습니다.
다형성이란 ‘여러 가지 형태를 가질 수 있는 능력’을 의미
디폴트 메서드
추상 메서드의 기본적인 구현을 제공하는 메서드
- 메서드 앞에 default 키워드를 붙이며 블럭{ }이 존재해야 한다
- default 메서드 역시 접근 제어자가 public이며 생략이 가능
- 추상 메서드가 아니기 때문에 인터페이스의 구현체들에서 필수로 재정의 할 필요는 없다
<<알고리즘 특강>>
얼마나 효율적으로 빠르게 결과를 만들어 낼 수 있는 방법을 찾아가고 연구하는게 알고리즘
정렬
데이터 정렬
탐색
포털 사이트 검색 기능
최단경로 알고리즘(다익스트라 알고리즘)
가장 빠른 길찾기
개발적 관점
복잡한 문제를 효율적이고 효과적으로 해결
문제 풀이 과정을 더 안전하고, 빠르고 수행하기 쉽도록 도와줌
취업준비생 관점
알고리즘 풀이를 코딩테스트에 이용하는 경우 많다
효율적이고, 안정적으로 돌아가게 설계햐야 한다
코드카타의 목적은 자바 문법과 익숙해지기
코딩 테스트 풀이 과정
1.문제를 꼼꼼하게 읽는다
코드를 작성해보려한다
실패
정답을 확인한다
풀이를 이해하려고 한다
해당 문제에 사용된 알고리즘이 있다면 어떤 것인지 찾아본다
사용된 알고리즘을 공부
충분한 문제 해답을 이해 및 암기 했다면 해당 문제를 닷 풀어본다
자료구조
효율적인 접근 및 수정을 가능하게 하는 자료의 조직, 관리, 저장을 읨
데이터 값의 모임, 데이터 간의 관계, 데이터에 작용할 수 있는 함수나 명령을 의미
-효율적인 데이터 관리
-데이터 조직
-재사용성
-알고리즘 최적화
배열
동일한 자료형의 원소들을 연속적인 메모리 공간에 저장하는 자료구조
배열의 크기는 고정
선언시 크기 지정해야 함
리스트(Array List)
배열과 ArrayList는 인덱스로 원소를 관리한다는 점은 동일하지만, ArrayList는 크기를 동적으로 지정가능
원시타입(primitive type)이 아닌 Wrapper Class만 사용 가능
맵(HashMap)
데이터를 저장할 댸 키(Key)와 밸류(Value)가 짝을 이뤄 저장
키(Key) 값은 중복될 수 없고, 밸류(Value)값은 중복 가능
원소들의 순서가 존재하지 않음
스택
마지막으로 입력한 값이 제일 먼저 출력되는 자료구조
=LIFO(Last In First Out) <->FILO(First In Last Out)
데이터 입력: push
데이터 출력: pop
큐(LinkedList)
제일 먼저 입력한 값이 가장 먼저 출력되는 자료구조
=FIFO(First In First Out)
데이터 입력: enqueue(인큐)
데이터 출려기 dequeue(디큐)
시간 복잡도
입력되는 n의 크기에 따라 실행되는 조작의 수
알고리즘이 실행 될 때 필요한 '입력값'과 '연산 수행시간'에 따라 '효율적인 알고리즘'을 나타내는 척도 의미
빅오 표기법(Big-O notation)을 통해 표현
수치가 작을수록 효율적인 알고리즘을 의미
공간복잡도
알고리즘이 실행될 떄 사용하는 메모리의양
알고리즘의 효율성을 판단하는 . 데사용되며, 일반적으로 메모리 사용량이 적을수록 더 효율적인 알고리즘
<새싹반 강의>
JVM
사용하는 이유: os에 종속적이지 않다. 공통 실행확경
Class Loader
java 파일 compile(javac Compiler)--> .class 파일의 바이트 코드가 생성
이렇게 생성된 클래스 파일들을 엮어서 JVM이 운영 체제로 부터 할당받은 메모리 영역인 RunTime Data Area로 각각 적재 하는 역활
Execution Engune
Class Loader에 의해 메모리에 각각 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행
-인터프리터: 명령어 하나하나 실행하는 방식
-JIT 컴파일러: 적정한 시간 에 전체 바이트 코드를 네티이브 코드러 변경해, EXecution Engine이 네이티브로 컴파일된 코드를 실핼해 성능을 높이는 방식
Garbage Collector
heap 메모리 영역에 생성된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역활
-stack: int, string
-stack: push, pop
-메소드 : 스테틱,파이널
Runtime Data Area
JVM의 메모리 영역으로 자바애플리케이션을 실행할때 사용되는 데이터들을 적재하는 영역
Method Area
클래스 멤버 변수의 이름, 데이터 타입, 접근제어자 정보같은 필드 정보와 메소드의 이름 리턴 타입, 파라미터, 접근 제어자 같은 메소드 정보, Type정보, Constant Pool, static 변수, final Class 변수 등이 생성
Heap Area
new 키워드로 생성된 객체와 배열이 생성
메소드 영역에 로드된 클래스만 생성 가능 GC가 참조되지 않는 메모리를 확인하고 제거하는 영역
PC Register
Thread가 생성될때마다 생성되는 영역, Program Counter
CPU에 있는 레지스터와 다르다
Native Stack Area
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역
변수
값을 정할 수 있는 메모리 공간
값을 담을 수 있는 상자
변하는수
-변수이름은 영문자, 숫자,$,_를 사용할 수 있다
ex)String abc_def;, String bye$bye;, String _hello;
-변수 이름은 숫자로 시작 할 수 없다
ex)String 123abc;
-자바에서 사용되는 예약어는 변수로 사용할수 없다
ex)String long
변수의 선언
패키지
패키지 이름은 소문자를 사용하여 작성
단어별 구문을 위해 언더 스코어(_)나 대문자를 섞지 않는다
클래스
클래스 이름은 명사나 명사절로 짓는다
인터페이스(interface)
명사/명사절 or 형용사/형용사절로 짓는다
메서드
기본적으로 동사로 시작
다른 타입르오 전환하는 메서드나 빌더 패턴을 구현한 클래스의 메서드에는 전치사 쓸 수 있다
상수
상태를 가지지 않는 자료형
static final 로 선언되어 있는 필드일 떄를 상수로 잔주
상수의 이름은 대문자로 작성, 복잡어는 언더스코어(_)를 사용하여 단어 구분
변수
상수가 아닌 클래스의 멤버변수, 지역변수, 메서드 파라미터에는 소문자 카멜표기볍을 사용
임시 변수 외에는 1글자 이름 사용금지
메서드 블럭 범위 이상의 생명주기를 가지는 변수에는 1글자ㅇ로 된 이름을 쓰지 않는다
반복문의 인덱스나 람다 표현식의 피라미드 등 짧은 범위의 임시 변수에는 관례적으로 1글자 변수명을 사용 할 수 있다
한 줄에 한 문장
문장이 끝나는 ; 뒤에는 새줄을 삽입
한줄에 여러 문장을 쓰지 않는다
조건/반복문에 중괄호 필수 사용
조건, 반복문이 한 줄로 끝나더라도 중괄호를 활용
이 문서에 언급된 중괄호의 전후의 공백, 제어문 앞 뒤의 새줄 규칙도 함께 고려
'내일배움캠프 7기' 카테고리의 다른 글
트러블슈팅(계산기 만들기) (0) | 2024.10.16 |
---|---|
Spring 7기 11일차(웹) (0) | 2024.10.15 |
Spring 7기 9일(자바 클래스,메서드) (1) | 2024.10.11 |
Spring 7기 8일차(자바) (0) | 2024.10.10 |
Spring7기 7일차(자바 사칙연산) (0) | 2024.10.09 |