1. Java의 특징들
- OS에 독립적이다
- 객체지향 프로그래밍 언어이다 (OOP)
- 포인터 메모리를 자동 관리해준다
- 동적로딩이 가능하다
- 멀티 쓰레드를 지원한다
2. 변수란?
- 메모리에 값을 기록하기 위한 공간이다
- 기록 후 지속적 사용이 가능하다
3. 데이터의 저장 단위
- 컴퓨터는 기본적으로 2진수를 사용하고 이것이 1bit
- 사용단위로 1byte = 8bit 가 된다
4. 변수를 선언한다?
- 메모리 공간에 데이터를 저장할 수 있는 공간을 할당한다는 것과 동일하다
5. Java의 기본 자료형 8가지
- 정수형 : byte short int long ( 1 , 2 , 4 , 8 byte)
- 실수형 : float long ( 4 , 8 byte)
- 문자형 : char (2 byte)
- boolean (1 byte)
- (String은 기본형이 아닌 참조형이다)
6. 변수 선언시 고려할 것
- 변수 명은 대소문자를 구분한다
- 예약어는 불가하다
- 숫자로 시작할 수 없다
- 특수문자는 _ , $ 만 허용되고 되도록 안쓰는게 좋다
- 관례적 표기법에 따라 쓰고 카멜표기를 따르면 첫문자는 소문자, 다음 단어 첫문자마다 대문자를 쓴다.
7. 상수와 리터럴은 비슷한 개념이지만 리터럴은 대입되는 값 그 자체를 의미한다.
8. 기본형 변수의 형변환이 가능하다
- 자동 형변환 : 작은 자료형 -> 큰 자료형은 컴파일러가 자동으로 바꿔준다.
- 강제 형변환 : 큰 자료형 -> 작은 자료형은 강제로 (자료형) 를 붙혀 바꾸며 이떄 값 손실이 생길 수 있다.
ex) double a = 5+ 5.9 ; -> 5는 컴파일러에 의해 자동으로 큰 자료형 실수로 바뀌게 된다
ex) int a = 5 + 5.9; -> 작은 자료형으로 바뀌어야 하므로 강제 형변환으로 소수 자리의 손실이 필요하다.
9. 오버플로우란?
- 표현 가능 범위를 초과하게 될때 최대 표현-> 최소 표현 값으로 나오게 되는것
10. 메모리의 구조
- Static -> 객체마다 공용으로 써질 것들을 만들어 놓으면 시작 시 Static 메모리에 올라가서 공용으로 사용된다
- Heap -> new 연산자에 의해 동적으로 할당되고 저장되며 객체 배열 등 사용자 정의로 사용될 수 있다.
- Stack -> 메서드를 호출하면 자동으로 생성되고 끝나면 자동 소멸된다
*Heap 영역은 객체, 배열 등 사용가자 크기를 정해 만들수 있어 동적 영역이고 가비지 컬렉터 등의 관리 영역도 된다
*Stack은 지역변수, 매개변수, 메소드호출 등 으로 사용된다.
11. 배열이란?
- 같은 자료형의 변수를 하나의 묶음으로 다루는 것.
- 선언하면 Stack에 주소를 저장하게 되고 new 연산자로 Heap 영역에 올리면 참조해 묶음을 만들어 낸다
12. 배열 복사
- 복사의 방법으로 2가지가 있다
- 1. 얕은 복사 : 객체의 주소값만 참조형 변수에 저장함
- 단순 주소 복사이므로 그냥 변수가 가진 주소값만 대입해 주면 끝난다.
- 하지만 하나의 배열을 두개의 변수가 참조하는 것이므로 서로가 영향을 준다는 문제가 있다.
- 2. 깊은 복사 : 새로운 배열 객체 생성 후 기본 배열 데이터를 복사한다.
- arrays클래스 등의 방법으로 깊은 복사를 지원한다
- System.arraycopy(arr1 , 0 , arr2 , 0 , arr1.length)
- arr2 = Arrays.copyOf(arr1, arr1.length)
- clone()
13. 2차원 배열
- 자료형이 같은 1차원 배열을 또 다시 배열로 묶은 것
- new int[3][] 등으로 표현한 것 처럼 뒷자리를 가변 배열로 서로 다르게 참조할 수 있다.
14. static 과 final
- static : 같은 타입의 여러 객체가 공유할 필드에 사용한다 => 정적 메모리 영역에 자동 할당됨
- final : 하나의 값만 계속 사용할 시 사용하며 상수는 모두 대문자로 표기한다.
15. final + a 의 효과
- final + 멤버변수 : 상수
- final + 필드 : 상수
- final + 메서드 : 오버로딩이 불가능해 진다
- final + 클래스 : 상속이 불가능해진다 (마지막 클래스)
16. 객체 지향의 특징
- 상속 + 추상화
- 캡슐화
- 다형성
17. 객체란 무엇인가?
- 자신의 속성과 기능( 값 + 함수) 이 다른것과 구분되어 식별 가능한 것 ( 이 틀을 클래스라 할 수 있다)
- -> 이것들이 new 연산자로 메모리에 생성된 결과물이 객체라 볼 수 있다.
- 즉 클래스의 정의대로 메모리에 할당된 결과물이다.
18. 클래스?
- 객체의 특성에 대해 정의한것( = 설계도의 개념)
- 추상화와 캡슐화가 필요하다
19. 추상화?
- 클래스의 속성과 기능중에서 필요한 공통점들을 추출하고 불필요한 부분을 제거하는 것
- '인간' 이라는 추상화로 공통점으로 뽑아내고 각각의 개성을 가진 1명은 객체가 된다는 것과 비슷
20. 캡슐화
- 추상화로 정리된 데이터들과 기능을 하나로 묶어서 관리한다.
- 데이터에 직접 접근을 제한하는 것을 원칙으로 간접 접근 메서드를 내부에 작성해 데이터에 접근한다.
- 이것으로 정보 은닉 효과를 만들어 낼 수 있다.
- 멤버 변수(인스턴스 변수)를 private 제한을 하고
- 이에 대한 접근 메서드는 public 으로 하여 간접 접근을 허용한다.
21. class 접근제한자
- 기본 default : 같은 패키지 내에서만 가능
- public : 전부 사용 가능
22. 필드 접근 제한자
- public : 전부
- protected : 같은 패키지 + 후손 패키지 까지 접근 가능
- default : 같은 패키지
- private : 클래스 내에서만 가능
23. 생성자란?
- 객체가 new 연산자로 Heap 메모리 영역에 할당될 때
- 객체 안에서 만들어지는 필드 초기화 + 생성 시 필요한 기능 수행
- 생성자명은 클래스명과 반드시 같아야한다.
- 작성하지 않으면 컴파일러가 자동으로 기본생성자를 만들어내고
- 매개변수가 있는 생성자를 만들면 기본생성자를 만들지 않으므로 별도로 기본 생성자를 만들어야 한다.
24. 오버로딩이란?
- 한 클래스 내에 동일한 이름의 메서드를 여러 개 작성해서 다른 기능을 구현하는 기법이다.
- 1. 메서드별로 이름은 같아야하고
- 2. 매개변수는 달라야 한다.
- * 다르단 것은 [매개변수 갯수] , [매개변수 타입], [갯수와 타입은 같지만 순서가 다름] 을 의미
- * 오버라이딩과 구분해야 된다
25. this 와 this()
- this 란 모든 인스턴스의 메서드에 숨겨진채 존재하는 레퍼런스로
- 할당된 객체 자신을 가르킴( 객체 자신의 주소)
- 생성자 매개변수 이름 = 필드명 과 같이 생성자 선언시 객체 필드를 매개면수와 구별시 많이 사용
- this() 란 같은 클래스의 서로 다른 생성자를 호출할 때 사용하며
- 생성자 () { this() } 처럼 다른 생성자를 호출 시 반드시 첫 출에 사용해야 한다.
26. 상속이란?
- 다른 클래스가 가지고 있는 멤버들을 새 클래스에서 작성하지 않고도 상속받아
- 자신의 멤버처럼 사용 가능해 지는것을 말함
- * 재사용 , 공동 규약의 정의를 할수 있게 된다.
- 이를 통해 중복을 제거하고 공통 관리로 추가 변경이 용이해지고 코드 양도 결론적으로 줄어들게 되는 장점이 있다
- <주의점>
- Java에서는 단일 상속만 허용하므로 주의한다.
- 모든 클래스는 Object 클래스의 후손이며 컴파일러가 자동으로 추가한다.
- 부모 클래스의 생성자, 초기화 블록은 상속되지 않는다.
- 부모의 private 멤버는 상속은 되지만 직접 접근할 수는 없다.
- * private 멤버는 super() 나 setter getter 로 접근해야 한다(간접)
27. super 와 super()
- super : 상속을 통한 자식 클래스 정의시 해당 자식클래스 내에서 부모 객체를 가르키는 참조변수
- super() : 부모 객체의 생성자를 호출한다. 컴파일러는 상속시 super()를 생성자 안에 자동으로 첫줄에 추가한다.
28. 오버라이딩
- 오버로딩은 한 클래스 내에서 같은 이름의 다른 메서드를 작성하는 것이고
- 오버라이딩은 상속 관계에서 자식 클래스가 부모에게 물려받은 메서드를 같은 이름으로
- 재작성해서 사용하는 것을 의미한다.
- <작성법>
- @Override 애너테이션을 쓰고
- 접근제어자는 부모와 같거나 더 넓게
- 예외 처리는 부모보다 좁게
- 1. 메서드 이름 동일
- 2. 매개변수 개수, 타입, 순서 동일
- 3. 리턴 타입 동일
- 4. private 메서드는 오버라이딩 불가함
29. 다형성
- 상속을 이용해 부모클래스 타입 참조 변수로 여러 자식 객체를 참조할 수 있는 것.
- 업캐스팅 : 부모타입 참조 변수로 자식 타입 객체를 참조
- Car -> Tesla 처럼 Car의 참조변수(주소)에 Tesla 객체를 만들어 그 주소를 참조 저장하게 하는것이다.
- Car는 Tesla 고유의 것은 사용 할 수 없지만 Tesla가 Car로 물려받은 (Tesla안의 (Car)것들은 사용 할 수 있게 된다.
- * = 부모 타입의 참조변수로는 자식 멤버를 쓸 수 없다.
- 다운캐스팅 : 자식의 객체를 참조하고 있는 부모 타입의 참조변수를 다시 자식 타입의 참조 변수로 바꿔서 자식 멤버를 사용할 수 있도록 하는 것
- 이 때 동적바인딩이 되게 된다.
- =참조는 부모타입을 하고있음에도 자식이 가진 자식의 오버라이딩 메서드에서 부모 것이 아닌 자식의 오버라이딩 메서드가 실행되게 되는 것.
30. 추상화
- 미완성된 것으로 자체 객체 생성이 불가하다. => 상속으로 사용
- abstract 메서드가 포함된 경우 반드시 abstract 클래스여야 한다
- 일반 변수와 메서드가 포함 가능하다
- 객체 생성은 안되지만 참조형 변수 타입으로는 사용 가능하다
- *추상 클래스 = 추상 메서드를 포함해 미완성 된 클래스 or 미완성이 아니더라도 객체생성이 되면 안되는 클래스
- 장점 : 상속받은 자식에게 공통된 멤버를 제공하고 일부 기능 구현을 강제화 할 수 있다.
31. 인터페이스
- 상수형 필드와 추상 메서드만을 작성 할 수 있다.
- 목적 :
- 일관된 인터페이스(작업환경) 제공
- 상속받은 모든 클래스가 동일한 메서드 강제 오버라이딩 하도록 일관성 유지
- 클래스 간의 접점을 강제로 만들어 줄 수 있다. (다중 상속 가능)
- 모든 메서드 : public abstract
- 모든 변수 : public static final
- (없어도 컴파일러에 의해 강제로 써진다)
- 객체 생성을 할 수 없고 참조 변수로는 사용할 수 있다 ( 다형성)
32. 오류 / 예외
- 비정상 종료 ->
- 컴파일에러 : 코드 오류
- 런타임 오류 : 논리 오류 -> if처리도 가능 할 수있다.
- 시스템에러 : 오작동
- 예외 : 소스코드 수정만으로 해결 가능한 오류를 말한다.
- try- catch문(+finally : 무엇이 되든 마지막에 수행되는 구문)
- 예외가 발생할 가능성이 있는 코드를 내부에 작성 시도해 발생하며
- catch가 잡아내 오류시의 코드를 설정한다.
- throws
- throw
- try- catch문(+finally : 무엇이 되든 마지막에 수행되는 구문)
33. Wrapper 클래스
- 기본 자료형을 객체화 시켜주는 클래스
- 기본 자료형과 관련된 특정 값 기능을 제공하고 기본 자료형을 다룰 수 없는 경우에 사용한다.
- 첫 문자가 대문자로 바뀌며 int -> Integer , char -> Character 로 예외적으로 바뀐다.
- 모두 static으로 객체생성 없이 사용 가능하다.
- 기본형과 객체타입 값 대입시 서로 자동으로 호환되도록 해주는 것을 박싱 / 언박싱이라고 한다.
'개발자로 업그레이드 되자 > JAVA' 카테고리의 다른 글
JAVA의 IO (0) | 2021.10.24 |
---|---|
JAVA 컬렉션(Collection) (0) | 2021.10.05 |
JAVA 문자열로 된 수식을 입력 받아 계산하는 계산기 (1) | 2021.08.15 |
JAVA 별 만들기 코드 (0) | 2021.08.15 |