JavaScript를 끝내면서 프로그래밍의 발전 과정을 배웠다
구조적 프로그램(절차적)
- 프로그램을 기능적으로 세분화 시킴
- 각각의 기능을 모듈화 시킴 → function 함수
- 장점 : 설계가 쉽다, 구현이 빠르다
- 단점 : 비슷한 기능의 모듈들을 가져다 써서 복잡하게 얽히게 됨 , 유지보수가 힘들다
객체지향 개념들이 생기고 그방식으로 프로그램을 할 수 있는 프로그래밍 언어들이 등장
→ 객체지향 개념을 가장 잘 대변하고 있는 프로그래밍 언어 : Java
구조적/절차적 언어는 기능으로 프로그램을 세분화 하였고,
빠르게 프로그램을 작성할 수 있었지만 유지보수성이 최악이었다.
(만드는 비용보다 유지보수 비용이 더 많이들었음)
객체지향 프로그램
- 프로그램을 기능으로 세분화하지 않는다
- 모델링: 현실세계에서 일어나는 문제를 프로그램적으로 해결하는 방법
- 문제를 구성하는 구성요소를 파악 → 그 구성요소간의 어떤 정보들이 오고가는지 파악해서 프로그램으로 묘사
- 추상화(단순화): 현실세계의 문제들을 필요한 부분만 단순화 시킨다
- 변수: 객체의 상태 - (java: 필드)
- 함수: 객체의 행위 - (java: 메소드)
- 클래스
- 객체를 모델링하는 수단
- 실제 데이터를 뽑아낼 수 있는 인스턴스를 만들 수 있는 도구
- 기존의 데이터타입을 여러개 이용해서 새로운 데이터타입을 만드는 개념으로 사용 ADT : Abstarct Data Type (추상데이터 타입을 만든다)
- 장점: 유지보수성이 높다
이를 해결하기위해 나온 것이 객체지향 언어였다.
해결해야 하는 문제의 구성 요소를 파악하고 단순화 시켜서 해결 했다.
설계하는데 시간이 오래걸리지만 유지보수성에 강점을 가지고 있다.
컴파일언어 VS 인터프리티언어
- 컴파일 언어: 컴퓨터가 알아먹을 수 있는 기계어로 변역한뒤 코드를 실행하는것
- C언어는 대표적인 컴파일 언어이다
- 인터프리티언어: 기계어로 번역과 실행을 동시에 시작
- JavaScript
- JAVA는 컴파일언어 + 인터프리티언어이다
1. 내가 작성한 코드(SourceCode)는 .java이다
2. 이것을 자바 컴파일러(javac)가 ByteCode로 바꿔준다. 이것이 .class 파일
3. JVM이 코드를 실행한다
코드를 실행시키기 위해 JVM은 API(javaClassLibrary)를 사용
JVM + JAVA Classs Library = JRE(Java Runtime Enviroment) 자바실행환경
JRE를 포함하여 Utility(개발도구)를 합친것 = JDK(Java Development Kit)
상태 ⇒ 변수 ⇒ 필드 field
행위 ⇒ 함수 ⇒ 메소드 method
- 자바에서는 함수가 없다
- 클래스의 집합이 자바이기 때문이다.
Source code의 이름을 class의 이름과 같아야 한다
퍼블릭 public 클래스가 없는 경우에는 일반 클래스의 이름을 사용한다
하나의 JavaFile안에 클래스는 여러개 나올 수 있다
단, public 클래스는 하나의 파일에 두개이상 존재할수 없다 (없어도 된다)
프로그램의 시작 포인트(entry point)는 public static void main(String args[]){}
자바는 자료형 검사가 엄격한 언어임으로 모든 변수는 자료형을 갖는다.
자료형에따라 할당하는 메모리 크기가 달라진다
- 정수가 int인 이유 : 메모리효율이 더 좋기때문에 가장 많이 사용한다
- boolean: 다른값으로 변환이 안된다
- 상수: 값이 재할당이 안되는 것 final
- 선언과 동시에 초기화가 되야함
- 상수는 모두 대문자 사용 snake case
final int My_SCORE = ;
- 문자열
String stuName;
- class → reference type → 문자열
- 참조자료형 변수는 4byte의 크기를 갖으며 인스턴스 객체에 접근할 수 있는 정보를 갖는다
public class Student2 {
1. filed 변수들 (객체의 속성)
2. Constructor 생성자들
3. methods 메소드들 (객체의 행위)
}
클래스 메서드는 여러 인스턴스가 공유
public class Student3 {
/** filed 변수들 **/
static int a = staticCall("1번");
int b = staticCall("2번"); //공간이 먼저 만들어지고
/** Constructor 생성자들*/
public Student3(){
this.b = staticCall("3번"); //초기화된다
}
/** methods 메소드들*/
public static int staticCall(String msg){
System.out.println(msg);
return 100;
}
public static void main(String[] args) {
System.out.println("4번");
int c = staticCall("5번");
Student3 s = new Student3();
}
// 1-> 4-> 5-> 2-> 3
}
1. 클래스를 전부 훑고 a의 static 변수/메서드는 곧바로 공간이 할당되고 초기화가 되어있음으로 먼저 출력된다
4. main 메서드가 호출되면서 4번이 출력된다
5. main 메서드 내에서 staticCall 메서드가 호출되어 출력된다
2. Student3 인스턴스를 생성하면서 s인스턴스가 생성되었다. b공간이 먼저 할당되어 staticCall 2번이 호출되었다
3. Student3 인스턴스가 생성된 후 초기화되어 마지막으로 3번이 호출되었다
⇒ 생성자에게도 적용이된다 : 생성자 오버로딩 Constructor Overloading
- Static binding : 프로그램이 시작해 메서드가 고정이되는 것 (C언어)
- Dynamic binding : 프로그램이 시작되다가 호출되는 시점에 연결되는 것