MY MEMO
[JAVA] 기본 개념 다지기 - 1 본문
출처 : https://programmers.co.kr/learn/courses/5
상수 선언시 : final
java에는 long long이 없음 -> long으로 사용
Casting(형변환) : type을 변환시켜줌
그냥 앞에 변환시켜주고 싶은 (형식)변수이름;
자료형 [] 배열명 = {};
배열명 = new 자료형 [개수];
배열명 = new 자료형 []{};
foreach문 예제
for(String number: numbers) {
System.out.println(number);
}
String은 상수인 변수에 저장됨
ex) String str1 = "hello";
hello라는 instance가 상수영역에 저장되어있으면
새로운 hello를 만들지 않고 찾은 후에 instance 저장
+) Instance?
객체를 생성하여 JVM (Java Virtual Machine 자바 가상 머신)이
관리하는 메모리에 적재된 것을 의미합니다.
String str2 = new String("hello");
라면 상수영역에 저장하지 않음
새로 만들고 가리킴
if(str1 == str2) //메모리 주소가 같아?
if(str1.equals(str2)) //값이 같아?
+) System.out.println(str1.substring(3));
//잘라서 보여주더라도 이 함수를 수행한 후 새로운 String 생성
System.out.println(str1); //자신의 값은 변하지 않음
field : 클래스 안에서 선언되는 멤버 변수
String
1. concat : str1.concat(str2);
2. substring : str1.substring(2); //2부터 출력(당근 index는 0부터 시작)
class는 instance화 하지 않은 채로 사용될 수 없음
static이라는 키워드가 붙어있으면 -> golbal
static을 사용하면 instance화 하지 않아도 사용 가능
만약 class에 private / public / protected를 사용하지 않으면
자동으로 private으로 설정
만약 클래스 instance해서 static value의 값을 변경했으면
마지막에 변경된 것을 적용
왜? -> instance 생성 시 만들어짐 (static이 아니면)
instance생성시 만들어지는 것이 아님 (static) -> 클래스 변수 : static한 변수, 값을 저장할 수 잇는 공간이 하나밖에 없어서 값을 공유
따라서 instance 생성 하지 말고 그냥 class이름 쓰는 것이 좋음
main은 static함수!
생성자
class를 instance할 때 자동으로 실행되는 함수
ex)
public Car(String n){
name = n;
}
//생성자 이름은 클래스의 이름과 같게
method overloading
method이름은 같으나 매개변수의 수 타입이 다른 경우 동일한 이름으로 method 정의
생성자 overloading
method와 마찬가지로 이름은 같으나 매개변수의 수나 타입이 다른 경우 정의 가능
package
관련된 클래스를 폴더별로 관리
Domain이름을 거꾸로 적음 + project이름 붙임
(다른 회사의 프로젝트와 중복되는 것을 방지)
package가 있는 class를 사용할 때에는 import 사용
ctrl+shift+o
상속
extends!
public class 클래스명 extends 부모 class명
부모 class의 method와 변수를 사용할 수 있음
부모는 자식의 class를 사용할 수 없음
캡슐화 : 관련된 내용을 모아서 가지고 있는 것
접근제한자
public : 넓은 의미로 모든 것이 접근 가능 (개방)
protected : 같은 package에 있는 것들에게는 공개
다른 package에 있더라도 상속해줬으면 ok
private : 자기 자신만 접근 가능
아무것도 적지 않는다면 default!
: 자기 자신과 같은 package 내에서 접근 허용
public > protected > default > private
+) abstract와 interface의 차이 : http://marobiana.tistory.com/58
추상 클래스 (abstract)
딱 정할 수 없는 모호한 class
ex) 새
오리 : 꽥꽥
새 : 짹짹
모두 다름 -> 추상 클래스로 생성한 이후 public abstract class 이름
extends를 해서 받아온 다음
자식 class에서 추상 class를 정의
정의할 때에는 abstract쓸 필요없이 그냥 public void ~ 이렇게 쓰면 됨
method가 하나라도 추상메소드인 경우 해당 클래스는 추상 클래스
추상 클래스 내부에 일반 메소드 생성 가능
+) 추상 클래스는 직접 사용할 수 없음! -> 꼭 상속을 해야
super class
A class와 B class가 있다 A가 B를 상속했다고 할때
A class를 실행하면 자신의 부모 -> 자신 순으로 출력된다
(A의 생성자에는 super()라는 것이 생략되어 있었던 것!)
ex) 내가 태어나기 위해서는 나 이전에 부모가 태어나야함
super : 부모를 나타내는 키워드
Overriding
부모가 가지고 있는 method와 자식이 똑같은 것을 가짐
부모의 method를 자식이 다시 정의해서 사용
자식 class에서 부모의 method 호출 가능
super.functionname();
2. static 메소드는 클래스에 속하는 메소드이기 때문에 상속이 안 된다.
3. 접근 제한자가 private 으로 정의된 메소드는 상속 자체가 안 된다.
4. interface 를 구현해서 메소드를 오버라이딩 할 때는 반드시 접근 제한자를 public 으로 해야 한다.
5. 메소드의 인자의 갯수와 타입이 완전히 일치해야 하고, 리턴 타입도 같아야 한다. 인자의 이름은 상관없다.
6. 부모 클래스의 메소드의 접근 제한자보다 좁아질 수 없다. 확장될 수는 있다.
7. 부모 클래스의 메소드보다 더 많은 예외를 던질 수 없다.
8. final 예약어가 지정된 메소드는 오버라이딩 할 수 없다.
클래스 형변환
부모타입이 자식타입을 가질 수 있음
Car (부모) -> Bus (자식)
Car c = new Bus(); //가능 -> 부모가 가지고 있는 method만 사용 가능
Bus (자식) -> Car (부모);
ex) Bus bus = (Bus) new Car();
car.getClass().getName() -> 자신의 자식 method의 이름 가져옴
interface(인터페이스)
구현을 하지 않고 기능들을 가지고 있는 것을 interface라고 한다
interface는 함수를 구현해 놓지 않고
이 interface를 어떤 새로운 객체가 implement를 하여 사용한다
TV (interface) -> LedTv(Class)
ex)
//interface도 객체 타입이 될 수 있음
TV tv = new LedTv();
tv.turnOn();
interface를 만들어 놓으면 그 종류에 맞게 함수 내용을 변경 가능하므로 유용!
interface default method
1. default method
2. static method
//interface class 안에서
default int 함수 이름() -> method 구현이 가능
static method 또한 구현이 가능
-> interface명.static함수의 이름
내부 클래스 (class안에 class)
1) 중첩 클래스, instance class
필드를 선언하는 위치에 class를 선언
내부 클래스를 사용하기 위해서는
내부를 둘러싸는 class 먼저 선언
외부 클래스.new 내부 클래스();
2) static class
외부 클래스를 선언하지 않아도 바로 static을 쓸 수 있음
외부클래스.내부클래스 별명 = new 외부클래스.내부클래스();
3) 지역 class (local class)
class안에 method
그 method 안에 class 정의
class는 method안에서만 정의 가능 -> class안의 method 사용 가능
4) 익명 중첩 class
//method를 구현하거나 method를 추가할 수도 있음
Action action = new Action(){
@Override
public void exec(){
System.out.println("exec");
}
};
action.exec();
Exception
try{} //예외가 발생할 수 있는 코드
catch(){} //예외 처리 블록
finally{} //예외 발생 여부에 상관없이 반드시 실행 (생략 가능)
throw
함수명 throws Exception,ClassCastException{
}
//함수 발생시 오류가 생기면 method를 호출한 쪽에서 오류를 처리해주세요
강제로 exception 발생시키기
throw new exception이름("");
사용자 정의 Exception
사용자가 직접 Exception을 정의해서 사용할 수 있음
public class 이름 extends Exception{}
//직관적으로 Exception이 어떤 것이 나왔는지 알 수 있도록 하기 위해
오류 처리를 하지 않으면 Compile Error / Runtime Exception
public class 이름 extends RuntimeException{
public 이름(String msg){
super(msg);
}
public 이름(Exception ex){
super(ex)
}
}
이걸 사용할 때에는
class안에 method 구현시
public void method이름(매개변수) throws 이름(위에서 정의한 Exception이름){
if(i<0) throw new 이름("");
}
Ex)
public class ExceptionExam{
public static void main(String[] args){
ExceptionExam exam = new ExceptionExam();
int[] array = new int[10];
try{
exam.get50thItem(array);
}catch(MyCheckedException e){
System.out.println(e.toString());
}
}
public int get50thItem(int []array) throws MyCheckedException{
if(array.length < 50){
throw new MyCheckedException();
}
return array[49];
}
}
'STUDYING > JAVA' 카테고리의 다른 글
[JAVA] Version 관련 (0) | 2018.02.09 |
---|---|
[JAVA] Set List Map Vector Properties 예제 (0) | 2017.10.20 |
[JAVA] 기본 개념 다지기 - 2 (0) | 2017.10.16 |
[JAVA] JAVA로 게임 만들기 (환경 설정) (0) | 2017.06.09 |
[JAVA] 상속 (0) | 2017.06.02 |