티스토리 뷰
혼자 공부하기 위한 자바 기초 정의 by 깽
[ver 1.0]
- Java : 이식성 높음 (운영체제 어디서든 복사해서 가져다 쓸 수 있음)
- .java -- 컴파일 1번 --> .class
- 이클립스를 사용하여 자바파일을 컴파일 해주면 쓸 수 없는 2가지 명령어가 있다 (javac와 java)
- .java 파일은 javac 명령어를 통해 .class 파일을 생성하고 (컴파일) , 그렇게 생성된 class파일은 바이너리 파일인데, 이 바이너리 파일을 JVM이 인식할 수 있다. 그러면 이렇게 바이너리 파일로 변환된 .class 파일을 java명령어를 통해 실행시킬 수 있다. 그러면 JVM은 해당 .class 파일을 실행시키고 그 수행결과가 컴퓨터에 수행된다.
- OOP(객체지향 프로그래밍)은 부품객체들을 먼저 만든 뒤 결합하여 전체 프로그램으로 완성시키는 것.
- 정수 데이터 타입으로는 byte(1byte, 8bit) / char(2byte) / short(2byte) / int(4byte) / long(8byte)
- 실수 데이터 타입으로는 float (4byte) / double (8byte)
- 논리 데이터 타입으로는 boolean (1byte)
- 객체는 속성(필드) + 동작(메소드) 를 가지는 모든 것.
- 클래스라는 하나의 틀 안에 실체를 가지는 것이 객체, 클래스의 틀에서 실체를 가질 때 그것이 인스턴스 화 된다고 함.
- 객체 사이의 관계 - 1) 집합관계(부품 - 완성품) / 2) 사용관계(객체 - 객체) / 3) 상속관계 (부모 - 자식)
- 캡슐화된 멤버 노출 / 숨김 여부를 결정하기 위해 접근제한자(Access Modifier) 사용
- 접근제한자(접근지정자) - public, private, protected, default
멤버 접근 클래스 | default | private | protected | public |
같은 패키지 클래스 | 접근가능 | 불가능 | 가능 | 가능 |
다른 패키지 클래스 | 불가능 | 불가능 | 불가능 | 가능 |
같은 패키지 서브 클래스(상속 시) | 가능 | 불가능 | 가능 | 가능 |
다른 패키지 서브 클래스 (상속 시) | 불가능 | 불가능 | 가능 | 가능 |
- 생성자는 클래스 내부에 클래스의 이름과 동일한 메소드이다. (생성자는 오버로딩 가능 / 오버로딩? 함수 이름은 같은데 인자 다르게 주는 것[중복정의] )
- new를 통해 객체 생성할 때만 생성자가 호출됨
- 생성자는 리턴값 없음
- 생성자 없는 클래스는 없음!!
- 클래스에 생성자 하나도 선언 X -> 자동으로 인자 없는 생성자를 만들어줌 (눈에 보이진 않음)
- 클래스에 생성자가 하나라도 선언되어 있음 -> 자동으로 인자 없는 생성자 생성 안됨
- <instance> VS <static> ----> 둘 다 필드, 메소드 가질 수 있다.
인스턴스 | 스태틱 | |
공용 여부 | X | O |
생성 시점 | 해당 객체가 생성될 때 | 클래스 내에서 정의될 때 |
생성 방법 예시 | int A / public int A() | static int A / public static int A() |
- 자바에서는 클래스 밖에 변수, 함수 선언 못함 (because of 캡슐화)
- 그래서 static이 클래스의 멤버로 존재하는 것이다. --> static을 통해 전역변수 & 전역함수를 클래스 내에서 선언
- static 예시
라고 되어있을 때, Time 클래스 멤버를 사용하려면
int H = Time.hour(11);
이렇게 사용해주면 됨.
- 클래스의 인스턴스 멤버를 사용하려면 Time t = new Time(); 로 객체를 생성해 줘서 int A = t.hour(11) 이렇게 해줘야 했을 것이다. 이것이 인스턴스와 스태틱의 차이이다.
- final : 클래스 & 메소드 & 상수 필드 앞에 붙을 수 있다. final이 붙으면 마지막 절벽이라 더는 접근 못한다는 의미가 아닐까 추측! ㅎㅎ
- final이 클래스 이름 앞에 붙을 때 : 해당 클래스는 상속할 수 없음을 나타냄
- final이 메소드 앞에 붙을 때 : 해당 메소드는 상속시에 오버라이딩 할 수 없음을 나타냄(오버라이딩? 부모 클래스에서 자식 클래스가 상속 받을때, 메소드를 재정의 할 수 있는 것)
- final이 필드 앞에 붙을 때 : 해당 필드는 반드시 초기값을 설정해 줘야하는데, 그렇게 설정한 초기값은 상수 필드가 되어 값을 바꿀 수 없다. ====> static이랑 final이랑 같이써서, 절대 바뀌지 않는 상수 값을 전역변수로 사용할 수 있다.(ex: 파이가 3.14인 것을 클래스 내에서 pubilc static final double 파이 = 3.14; 이런 식으로 선언)
- 추상(abstract) 클래스 - 1)추상 메소드를 포함하는 클래스, 클래스 앞에 abstract 붙여야됨 / 2) 추상 메소드는 없지만 abstract로 선언된 클래스
- 추상 메소드의 예) public abstract void setName(String s); 처럼 메소드 속({}안)에 아무것도 없는 메소드
- 추상 클래스는 new로 객체(인스턴스) 생성 못함(인스턴스화 불가능)
- 추상 클래스의 상속 : 추상클래스를 extends로 상속한 서브클래스 또한 추상 클래스가 되는데, 해당 서브클래스가 추상 클래스가 되지 않으려면 추상 메소드 들을 모두 오버라이딩(서브 클래스 내에서 부모한테서 추상 메소드 였던 것들을 {} 속을 코딩하여 재정의)하면 됨.
- 예를들어 abstract class 부모클래스 { abstract public void 메소드A(); //추상 메소드 } 라고 되어 있는 상위 클래스를 abstract class 자식클래스 extends 부모클래스 { public void 메소드A() {내용 채워져 있음, 즉 코딩 되어 있음; //더는 추상메소드 아니게 재정의(오버라이딩)함 } 으로 해주면 자식클래스는 new로 인스턴스화 가능해진다. --> 즉, 부모클래스 var1 = new 자식클래스; 이런식으로 해줘도 된다는 뜻!
- 인터페이스(interface) : 규격 , 메소드들을 정의해 둔 것.
- public interface 인터페이스명 { 내용... }; 인데, 인터페이스는 특징이 있다.
- interface 안 ( {} <-- 여기 안 ) 에 멤버는 추상 메소드와 상수(abstract final로 선언된 필드)만으로 구성이 된다.
- interface 안, 모든 메소드는 public 인데, public은 생략 가능하다.
- 상수(abstract 필드)는 public abstracr final이 생략 가능하다.
- interface의 객체를 생성할 수 없다. ==> 따지고 보면 당연한 말, 인터페이스 내의 모든 메소드는 추상 메소드. 추상메소드를 가지는 클래스는 추상 클래스로, 추상 클래스는 객체생성(인스턴스 화)이 불가능 하기 때문이다.
- 다른 인터페이스에 상속 가능
- interface는 레퍼런스 변수의 타입으로는 사용 가능 ==> 이것도 당연한 말, 추상 클래스는 객체생성(인스턴스 화)은 불가능 하지만 레퍼런스 변수로는 쓰일 수 있다. (레퍼런스 변수? 클래스명 변수명 꼴로 만들어 지는, 일종의 객체 생성(인스턴스 화)이 되기 바로 전 단계로, 객체를 생성하기 위해 변수를 선언하는 것을 의미)
- interface 상속 : 인터페이스는 규격이므로, 인터페이스를 수정하면 이미 그 인터페이스(규격)에 맞게 작성된 소프트웨어들에게 피해를 준다. 그러므로 인터페이스를 상속받아서 수정을 하게 된다. 인터페이스를 상속할 때에는 보통 클래스의 다중 상속은 불가능하지만, 인터페이스는 다중 상속이 가능하다.(규격이므로) 인터페이스 상속 시에도 extends를 사용한다. (다중상속? extends 뒤에 여러 인터페이스를 두어 상속 받을 수 있는 것 ==> ex: interface 자식인터페이스 extends 엄마인터페이스, 아빠인터페이스)
- interface 구현 : 클래스가 인터페이스를 상속받을 순 없지만, 구현(implements)은 가능하다.
- ex) public 인터페이스명 { void 메소드A(); } 일때, public class 클래스명 implements 인터페이스명 { void 메소드A(){코딩}; 추가적인 메소드 정의 가능; } 이 가능하다.
- interface의 다중 구현도 가능하다 (즉, public class 클래스A implements 인터페이스B, 인터페이스C {내용 코딩}; 가능)
- 위에 예시대로 된다면 클래스A에서는 인터페이스B와 인터페이스C에 있는 모든 메소드들을 구현할 수 있다. 추가로 클래스A만의 추가적인 메소드 또한 정의할 수 있다.
- 한마디로 class에서 class를 상속 받으려면 extends를 사용하고, class에서 interface를 상속(구현) 받으려면 implements를 사용하면 된다!!
- extends나 implements나 어쨌든 상속이기 때문에 둘 다 오버라이딩(메소드 재정의)이 가능하다!
- public class 자식클래스 extends 부모클래스 implements 인터페이스A, 인터페이스B 처럼 하나의 자식클래스가 부모클래스를 상속받는 동시에, 인터페이스들을 다중구현(상속)도 할 수 있다.
- <abstract class> VS <interface>
추상 클래스(abstract class)
- 추상 메소드뿐 아니라 일반 메소드도 포함 가능
- 상수 필드 뿐 아니라 변수 필드도 포함 가능
- 다중 상속 불가능 (모든 클래스가 다중 상속 불가능)
- 모든 서브 클래스에 공통된 메소드가 있는 경우에는 추상 클래스가 적합
인터페이스(interface)
- 메소드는 오직 추상 메소드뿐!! (모든 메소드가 추상 메소드임)
- 오직 상수 필드만!! (상수필드만 포함 가능함)
- 다중 상속(구현) 가능
'Java' 카테고리의 다른 글
메소드에 변수값을 전달 vs 객체 자체를 전달 (0) | 2017.02.06 |
---|---|
자바 추상클래스, 추상메소드 (0) | 2017.02.06 |
자바 인터페이스와 상속 정리 (0) | 2017.02.06 |
접근제어자 (0) | 2017.02.06 |
자바의 생성자 (constructor) (0) | 2017.02.06 |
댓글