1일차 복습
----------------------------------------------------------------------------------------------------------------------
1. 객체지향 프로그래밍
-해결해야 하는 문제를 그대로 프로그램으로 모델링
-장점: 유지보수성이 좋고, 재활용성이 좋다.
-단점: 설계와 구현이 어렵다.
2. 객체모델링
해결해야 하는 문제를 구성하고 있는 개체를 판별
추상화(Abstraction)
객체모델링을 하기 위한 도구: class
3. class의 의미
-객체모델링의 수단
-ADT(Abstract Data Type)
-instance를 생성할 수 있는 근거, 수단
4. JVM(Java Virtual Machine)
=>자바프로그램을 실행시켜주는 주체
+java class library(클래스로 주어짐)
=>JRE(Java Runtime Environment)
library=>특정기능을 수행할 수 있는 코드 단위 함수, method, class
platform=>다른 프로그램을 실행시켜줄 수 있는 실행환경
framework=>라이브러리를 포함하고 전체 로직이 어떻게 동작하는지를 가지고 있는 구현체(규칙)
+javac, java, javadoc, javap...
=>JDK
5. JVM이 관리하는 메모리 구조
-stack: 메쏘드가 호출되면 해당 메쏘드를 위한 영역이 잡히고, 그 안에서 지역변수가 저장
-heap: instance는 모두 heap에!(new)이용
-method area: JVM이 instance를 만드려면 class에 대한 정보가 필요한데, class의 정보가 들어 있는 것이다.
6. static
필드와 메쏘드에 붙는다.
필드: 공간이 힙에 만들어지지 않고 메쏘드 영역에 만들어진다. 모든 인스턴스에 의해서 공유되는 필드!
인스턴스가 없이 클래스 이름으로 다이렉트 access가능
7.package & import
package: class를 묶어놓은 것
8. access modifier
정보은닉!
public: package와 상관없이 무조건 접근 가능
protected: 상속과 관련
default: 같은 package 내에서 접근 가능
private: 같은 클래스내에서 접근 가능 -> getter&setter->information hiding
9. overloading vs overriding
overloading: 타입이 다르게 같은 이름의 method
overriding: 하위클래스에서 상위클래스와 같은 이름의 method
--------------------------------------------------------------------------------------------------------------------
10. 상속
is-a relationship
생성자는 상속이 안된다.
하위클래스의 상속자가 호출되면, 상위클래스의 인스턴스도 생성된다.
subclass superclass
메인!
JVM이 만든 메모리 구조
MMain에서 SuperClass subClass=new Subclass()와
SubClass subClass=new Subclass()에 대해서 살펴보자!
이는 다형성을 보여준다!
subclass의 객체가 superclass의 타입을 가질 수 있다.
1. methodArea에 Main Class에 대한 정보가 들어간다. SuperClass에 대한 정보가 들어간다. SubClass에 대한 정보가 들어간다.
2. SubClass() 생성자를 불러오니까, 일단은 super class인 Super Class의 정보가 method Area에 올라온다.
그리고 힙에 superClass의 인스턴스가 올라온다.
3. Subclass의 정보가 method Area에 올라온다. 그리고 힙에 subclass의 인스턴스가 올라온다.
4. 메인의 subClass는 스택에 올라오고, 타입이 SuperClass인지, SubClass인지에 따라서 가리키는 화살표가 달라진다.
*method는 overriding되었다면 타입과 관련없이 하위 클래스의 메쏘드를 사용하게 된다.(Dynamic Binding)
상속자에는
super()혹은 this()가 들어오게 된다.
this(): 자신이 가지고 있는 다른 생성자를 호출
super(): 상위클래스의 생성자를 호출
super()와 this() 중 하나만 와야 하고, 가장 맨 윗줄에 써준다!
아무것도 안써져 있으면 super()
모든 클래스의 상위클래스는 Object class
11. 중요 문제
main메쏘드를 호출하려면
이 클래스에 대한 정보를 일단 method area에 올릴려다보니까
SuperClass에 대한 정보가 필요하다.
SuperClass에 대한 정보가 method area에 올라간다.
SuperClass에서 static int b: method area에 공간이 만들어진다.
staticCall을 호출해서 화면에 찍힌다.=> 2번 문장입니다
그 다음 하위 클래스에 대한 정보가 method area에 올라간다.
static field인 static int d=>staticCall이 호출된다.=>7번 문장입니다.
여기까지 준비단계
===================
main을 호출한다!
10번 문장입니다
이제 인스턴스를 만들어준다.
상위클래스의 인스턴스부터 만들어진다.
super(100); 정수값을 받아들이는 생성자를 호출하는구나
public SuperClass(int i)가 호출된다.
this() 내가 가지고 있는 다른 생성자 중에 인자 없는 생성자를 호출
생성자는 인스턴스의 초기화를 담당한다.
a라는 공간은 이미 힙에 공간이 만들어져 있다.
1번 문장입니다
3번 문장입니다
4번 문장입니다
이제 상위클래스의 instance가 만들어졌다.
=============================
이제 하위클래스의 instance(내거)를 만들어주자.
6번 문장입니다(초기화되기 이전에 힙에 공간이 마련되어있다)
8번 문장입니다
super.myFunc();
super는 아까 만들었던 상위클래스의 instance를 지칭한다.
5번문장입니다
생성자가 끝나서 instance가 만들어졌다.
=======================
하지만 타입이 SuperClass이다.
SuperClass obj= new Exam01_inheritanceOrder();
obj.myFunc();
여기서 obj는 SuperClass의 데이터타입을 가지고 있다.
그렇다면 myFunc()는 SuperClass의 myFunc를 가리키는 것 같이 보일 수 있지만,
Dynamic Binding!!
method가 overriding된 경우, 최종 overriding된 method로!
그래서 obj.myFunc()를 하면 최종적으로 overriding된
9번 문장입니다
2-7-10-1-3-4-6-8-5-9
12. System.out.println()의 의미
import java.lang.System이 필요하다
하지만 javac 컴파일러가 자동적으로 import해준다.
java.lang이라는 패키지 안에 있는 System이라는 클래스!
out은 필드일까 메쏘드일까?->필드!(괄호가 없으니까)
이 필드는 static이다. 왜냐하면 instance를 생성하지 않고 바로 접근했으니까
System.out은 instance이다.
instance가 갖고 있는 메쏘드인 println()을 호출!
13. encapsulation
데이터 구조와 데이터를 다루는 방법을 결합시켜 묶은 것을 지칭
class오부터 파생된 객체가 독립적으로 역할을 수행하기 위해
데이터(field)와 기능(method)을 묶어서 관리
encapsulation을 하는 이유: class의 재활용성을 높이고 에러 발생을 최소화
14. information hiding
class는 외부에서 알 필요가 없는 field나 method를 외부에 노출시킬 필요가 없다.
불필요한 정보는 숨기고, 최소한의 정보만을 이용하여 class를 쉽게 사용할 수 있어야 한다.
JAVA에서는 access modifier를 이용하여 선언된 class의 외부에서의 접근을 제어하면서 정보를 은폐
Encapsulation된 코드를 제공할 때 외부에서 함부로 수정, 호출해서는 안되는 field,method를 보호하고 프로그램의 안정적인 수행을 위해 필요
15. keyword
final int a=100;//해당 필드를 상수화
더이상 변경 불가
final class: 상속할 수 없다
final method: 마지막 메쏘드! 더이상 재정의(오버라이딩할 수 없다)
16. 추상클래스와 추상메쏘드
package test;
/*추상클래스안에 추상메쏘드가 들어있다. 추상 메쏘드가 하나라도 있으면 추상클래스가 된다*/
//이러한 추상클래스로부터는 인스턴스를 만들어낼 수 없다.
public abstract class TestClass {
//1. fields
//2. constructors
//3. methods
//method의 정의
public void aa() {
}
/*실제로 하는 일이 정해지지 않았다! 추상 메쏘드*/
public abstract void bb();
}
class Myclass extends TestClass
{
자식 클래스는 추상 메쏘드에 대해 메쏘드 오버라이딩 해야 한다!
}
17. 배열: 같은 데이터 타입을 이용
Person student=new Student();
Person teacher=new Teacher();
Person staff=new Staff();
데이터 타입이 Person이므로 Person의 메쏘드와 필드만 사용가능! Student의 메쏘드는 사용 불가
그래서 Type Casting을 해준다!
((Student)student).study();
Person arr[]=new Person[3];
arr[0]=student;
arr[1]=teacher;
arr[2]=staff;
for(Person p: arr){
}
18. 인터페이스
//class와 비슷하게 생겼다. class라는 키워드 대신 interface라는 키워드를 사용한다
// 필드, method가 나올 수 있따.(생성자는 나올 수 없다!)
//필드는 반드시 상수로 지정해야 하고, static으로 선언해야 한다.
//method는 반드시 public abstract로 지정
public interface MyInterface {
public static final int myNumber=100;
public abstract void aa();
public abstract int kk();
}
implements할때 추상메쏘드를 가져오는 거니까 메쏘드를 override해서 사용!
implement를 하면 MyInterface를 상위타입으로 생각!
19. collection
//ctrl+shift+O하면 import가 자동적으
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
//java collection에 대해서 알아보아요!
//기본적으로 우리가 사용할 수 있는 collection은 크게 3가지가 있어요
//List 계열, Map계열, Set계열
//List 계열=>ArrayList class
//Map 계열=>HashMap class
//Set 계열=>HashSet class->중복을 배제
//collection이 가지고 있는 특징
//안에 객체만 저장할 수 있다. 크기가 가변적이다. 같은 데이터타입을 이용하지 않아도 된다.
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
// ArrayList를 이용하자
List list=new ArrayList();
list.add("홍길동");
list.add(1);//list.add(new Integer(1));이렇게 해서 객체를 넣어줘도 되지만
//그냥 list.add(1)해도 됨-> auto boxing: 자동적으로 객체 시켜줘요
list.add(true);//auto boxing(원래는 new Boolean(true))
//Object k=list.get(index);// generic으로 잡지 않으면 Object 타입으로 반환된다
// ArrayList안에 같은 데이터 타입이 일반적으로 사용
//List<String> list=new ArrayList<String>();//문자열만 들어올 수 있다고 지정=>Generic
//
//로또 번호 생성기(1~45까지의 숫자를 6개 랜덤으로 추출)
//랜덤숫자를 발생시키기 위해서 Random class이용
Random random=new Random();
//int k=random.nextInt(45)+1;
HashSet<Integer> set=new HashSet<Integer>();
while(set.size()!=6) {
set.add(random.nextInt(45)+1);
}
System.out.println(set);
}
}
20. Exception
package exception;
//Java는 실행시 오류를 크게 2가지로 구분
//1. Error: 복구가 불가능한 경우
//2. Exception: 오류인데 복구가 가능, 어찌어찌 해결해서 프로그램이 지속적으로 수행이 되도록 할 수 있다. Exception Handling을 통해 가능
//Exception이 발생하면 Exception객체가 생성-> JVM이 생성
// 객체가 만들어진다는 말은=>클래스가 있다는 말
// Exception class
// ClassNotFoundException, ArithmeticException, ClassCastException
// Java에서 Exception을 처리하는 방법을 딱 1개
// try ~ catch 구문을 이용
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
int k=100;
try {
int result=k/0;
}catch(ClassCastException e) {
System.out.println("문제발생..해결해야해요");
// ~발생한 문제를 해결하는 코드가 나와야 한다.
}
catch(ArithmeticException e) {
System.out.println("문제발생..해결해야해요");
// ~발생한 문제를 해결하는 코드가 나와야 한다.
}
//그냥 catch(Exception e){<-이렇게 해주면 모든 exception의 최상위 클래스
//에러가 있건 없건 실행되는 부분->finally
finally {
}
}
}
'코딩 > JAVA' 카테고리의 다른 글
겨울방학 JAVA 3일차 (0) | 2017.12.28 |
---|---|
겨울방학 JAVA 1일차 (0) | 2017.12.27 |
점프투자바를 참고했음을 알립니다! (0) | 2017.05.09 |
인터페이스 (0) | 2017.04.01 |
생성자 (0) | 2017.04.01 |