내일배움캠프 Java 강의를 계속 수강중이다.(~3주차)
오늘 TIL(Today I Learned) 강의를 들었는데, 간단하게 내용을 정리해 보자면 다음과 같다.
결론
취업 === 증명 의 과정
!!!일단 작성하기
!!!발전 시키기
뭐 마지막줄이 핵심 아닐까?
마찬가지로 공부 내용을 조금 정리해 놓으려고 한다.
Array는 정적배열 최초 길이를 알아야 함
List는 동적배열 크기가 가변적으로 늘어난다
- 생성 시점에 작은 연속된 공간을 요청해서 <참조형> 변수들을 담아놓는다.
- 값이 추가될 때 더 큰 공단이 필요하면 더 큰 공간을 받아서 저장하니깐, 상관없다
리스트만들기, 기능들
import java.util.ArrayList;
ArrayList<Integer> inList = new ArrayList<>(Integer)();
intList.add(1);
intList.get(2);
intList.set(1,10);
intList.remove(0);
intList.clear();
대략 이정도는 기본 코드
Linked list
LinkedList<Integer> linkedList = new LinkedList<Integer>();
기본적 기능은 ArrayList와 같은데, 조회속도는 느리지만 값 추가, 삭제는 빠르다는 장단점이 있다.
Stack
Stack<Integer> intStack = new Stack<Integer>();
스택은 스택인거같다. FILO(Basket)
push,peek,size 등의 기능이 있다.
Queue
Queue<Integer> intQueue = new LinkedList<>();
큐는 FIFO, 먼저 넣은게 먼저 나온다.
Set
Set<Integer> intSet = new HashSet<>();
HashSet, TreeSet 등으로 응용해서 같이 사용 가능
Set은 생성자가 없는 껍데기라서 바로 생성할 수 없음!!
생성자가 존재하는 HashSet을 이용해서 Set을 구현할 수 있다.
1, 2, 4, 1 을 넣으면 1, 2, 4만 나옴
Map
Map<String, Integer> intMap = new HashMap<>();
Map : key - value pair
key는 unique값
intMap.put("일",1);
이런식으로 데이터를 넣을 수 있다.
객체 / 클래스 / 인스턴스
이 부분은 항상 쓰면서도 헷갈린다.
비유를 하자면
클래스는 설계도
인스턴스는 설계도로 만든 하나의 자동차
위의 이 과정을 인스턴스화
여러 개의 인스턴스들을 크게 통틀어서 자동차 객체
오버로딩
오버로딩은 메서드 이름은 같고 , 매개변수의 개수 or 타입 or 순서가 다르다
응답 값만 다른것과 접근 제어자만 다른 것은 오버로딩 불가
장점 : 메서드 이름 하나로 상황에 따른 동작을 개별로 정의할 수 있다
메서드의 이름을 절약할 수 있다
참조형 매개변수는 데이터의 주소를 받아와서 데이터를 바꿀 수 있다
다른 클래스의 외부 메서드를 사용해서 내부 데이터를 수정 가능
다른 클래스를 넘겨서 그 클래스의 멤버 수정 가능
맴버 = 필드 + 메서드
인스턴스 멤버 = 인스턴스 필드 + 인스턴스 메서드
클래스 멤버 = 클래스 필드 + 클래스 메서드
필드와 메서드는 선언하는 방법에 따라서 인스턴스 멤버와 클래스 멤버로 구분 가능
인스턴스 멤버는 객체 생성 후에 사용 가능, 클래스 멤버는 객체 생성 없이도 사용 가능
필드와 메서드를 클래스 멤버로 만들기 위해서는 static으로
인스턴스 필드 사용하지 않고 실행되는 메서드가 있다면 static 키워드를 사용해서 클래스 메서드로 선언하면 됨.
예) GENESIS에서 만드는 자동차는 모두 GENESIS를 박아서 나오니까
static String company = "GENESIS"; 같이 하면 된다
그리고 메인에서 호풀할때 Car.company 이렇게 호출하면 나온다
static은 인스턴스화(Car car = new Car(); )이렇게 해서 호출할 필요 없이 바로 호출하면 된다
상속 / 포함
상속 : ~는 ~이다 고래는 포유류다
포함 : ~는 ~를 가지고 있다 고래는 포유류를 가지고 있다..? - x
자동차에는 여러개의 타이어가 들어가야 하니까 클래스를 가변길이로 받아서 4개씩 만들어준다. setTire(Tire ... tire) 이렇게
그래서 new Tire 4개 해서 배열에 넣고 car.setTire로 해서 타이어들을 각각 넣어준다.
자바는 다중상속을 지원하지 않는다..
클래스에 final 붙이면 더이상 상속 불가능
Object 클래스는 자바의 최 상위 클래스이기때문에 모든 클래스는 Object의 메서드 사용 가능
예)Object의 자식 클래스가 String 클래스
오버라이드할땐 @Override
super 는 부모 클래스의 멤버를 참조할 수 있는 키워드.
sportsCar.model과 sportsCar.getModel()은 다른 결과를 낳는다.
-> setCarInfo를 통해 스포츠카의 모델은 스포츠카의 모델이고, 부모의 모델을 페라리로 해놨기 때문에.
getModel()은 부모의 모델을 가져오는 메서드
다형성
Mammal mammal = new Whale(); 같이 자식 생성자로 부모가 생성되면 부모의 타입으로 생성이 된다
Whale whale = (Whale) mammal; 같이 강제 형변환을 할 순 있지만, 자동 형 변환이 완료된 애들만 "돌아갈 수 있는것"
다형성이란 '여러 가지 형태를 가질 수 있는 능력'
예를 들면 자동차의 핸들을 교체하면 핸들링이 부드러워지는것처럼
타이어를 인자로 받는 자동차를 생성할때(자식클래스의 생성자를 사용해서 부모 생성), 결과적으로 각자 다른 자동차가 만들어 질 수 있음
instance of = 검증. ~는 ~의 인스턴스가 맞니? '원래 클래스 명'을 체크하는 기능. 형변환이 되긴 했지만 new Child로 만들었기 때문에 true
자식은 부모의 인스턴스, 반대는 틀림
추상 클래스(abstract)
미완성된 class
공통 메서드만 추출해놓은 클래스
부모는 완성시키지 못한 메서드를 가지고 있고,
자식이 상속받아서 완성!
규칙 : 추상 메서드를 포함할 수 있고, 메서드가 없어도 추상 클래스는 선언 가능
추상 클래스는 자식 클래스에 상속되어 자식 클래스에 의해서만 완성 가능
추상 클래스는 여러개의 자식 클래스들에게서 공통적인 필드나 메서드를 '추출'해서 만들 수 있다.
정의만 할 뿐 실행 내역 x
상속받은 클래스에서 추상 클래스의 추상 메서드는 반드시 '오버라이딩' 되어야 한다(인터페이스)
인터페이스
인터페이스는 두 객체를 연결해주는 다리 역할을 해준다
public interface 인터페이스명
{
}
모든 멤버변수는 public static final
모든 메서드는 public abstract
구현은
public class 클래스명 implements 인터페이스명{
//추상 메서드 오버라이딩
@Override
public 리턴타입 메서드이름(매개변수,./..){
//실행문
}
}
인터페이스의 추상 메서드는 구현될 때 반드시 오버라이딩 되어야 한다.
일부만 구현해야 한다면 해당 클래스를 추상 클래스로 변경해주면 된다.
인터페이스 간의 상속은 extends
일반 클래스는 다중상속이 안되지만, 인터페이스는 가능
디폴트 메서드와 static메서드
default는 추상 메서드의 기본적인 구현을 제공하는 메서드.
구현부가 있어야 한다
기본 접근 제어자는 public, 생략 가능
!오버라이드 하지 않고 바로 사용 가능한 메서드
static과 비슷하다(class.메서드)
스태틱은 다만 인터페이스.메서드 이렇게 사용할 수 있다
인터페이스를 받아서 만들어진 클래스 안에서, 인터페이스의 함수 말고 그냥 자기가 만든 함수는
인터페이스를 쓸 때 사용할 수 없다.
예)A를 상속받아 만든 B 클래스에서 자기가 가진 b메서드는 A가 사용할 수 없다.
티비와 리모컨을 예시로 들자면
티비는 LG,Samsung 등 브랜드가 있고 리모컨이 필요하니까
LGTV는 티비를 상속받으면서 리모컨을 인터페이스로 받을 수 있는 것
좀 두서없지만 강의들으며 메모한 내용을 정리 해 봤다.
메모장을 로컬에 저장할 순 없으니 벨로그에 올릴 생각이다!