포스코DX X 비트교육센터 6기 - 자바 객체지향
이클립스 프로젝트 jdk, java 버전 바꾸기
ABOUT JAVA
- 자바의 빌드 툴 + 프로젝트 구조를 가짐 : Ant(이제 안씀), maven, gradle
- 빌드 도구(Build Tool) 란? 빌드 도구(Build Tool)란 소프트웨어 개발에 있어서 소스 코드를 실행 가능한 애플리케이션으로 만들어주는 도구를 말합니다.
- Maven
- src / main / java , resourse
- src / test / java, resourse (여기에 java에서 짜기 시작한다.
- pom.xml(메이븐한테 프로젝트를 설명해 줌) / mainfest / package (jar야? 콘솔 war야? 웹) , java compiler, dependency(어떤 라이브러리를 쓰고있음), build (플러그인을 담음)
- 메이븐 총정리
- jar? war?
- maven을 사용하는 이유는? 1. dependency 해결하려고 2. build를 가지고 설정하려고
- java bulid tool이란?
- maven의 폴더 구조
+ src
+ pom.xml
jar? war?
모두 JAVA의 jar 툴을 이용하여 생성된 압축(아카이브) 파일
어플리케이션을 쉽게 배포하고 동작시킬 수 있도록 있도록 관련 파일(리소스, 속성파일 등)들을 패키징해주는 것
- JAR (Java Archive)
- WAR (Web Application Archive)
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.poscodx</groupId>
<artifactId>helloworld2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.build.outputEncoding>UTF-8</project.build.outputEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies></dependencies>
<build>
<finalName>helloworld</finalName>
</build>
</project>
깃에 올릴 것 2개
이렇게 작성하고 나면,
깃허브 프로젝트 이클립스에 가져오기
finish
깃에 잔디가 안 심어지면,
add해줌
메이븐 모듈
그리고 부모 메이븐 프로젝트에 src 지우기, .gitignore파일 만들어서 깃에 올리기
기본 프로그래밍
- 도메인 = business = 문제영역
ex. 도메인 : 도서대여점 운영
- 객체
- 데이터 저장 (데이터 객체) ex. 책
- 기능을 담는 객체 ex. 책 저장, 검색, 삭제
-
message == method
- UML (분석 및 설계)
- 클래스다이어그램 : 객체 찾기 -> 클래스 담기 -> 관계 설
- 설계 원칙 SOLID
-
- 추상화
- 불필요한 것을 빼고 필요한 것만 남기는 것이다. 도메인에 입각한 클래스, 객체를 설계할 때, 추상화작업이 필요하다. 그래서 클래스는 재사용이 어렵다. user 객체만 어마무시하게 만들어진다. ex) 도서대여점 user에게 신발가게 user처럼 신발사이즈를 물어볼 수 없다.
***********클래스는 재사용이 어렵다.
- 클래스
설계도다. 이를 토대로 생성하면, 실제 세상의 인스턴스가 된다.
VS Reference란? object가 저장된 곳의 주소를 일련의 bit로 가지고 있는 것
-
객체(Object)란 자신 고유의 속성을 가지는 물리적, 추상적인 모든 대상을 일컫는다.
-
클래스(Class)란 객체들을 소프트웨어 내에서 구현하기 위해 만든 설계도이다.
- 이를 통해 생성된 객체 하나하나를 인스턴스(Instance)라고 부른다.
- 대체로 객체와 인스턴스는 혼용해서 표현한다.
클래스와 관련된 용어
- 필드
- 메소드
- 생성자
+) int i = 10 » i는 주소야. 주소에 10이 들어있는거야.
-
정보 은닉(=캡슐화)
-
상속을 왜 해?
- 코드 재사용을 위해서 (30점)
- ****확장성을 위해서 (70점)
- 프로그램은 계속 변함. 버전이 계속 커짐. 그러므로 확장에 대해 열려있어야한다.
- 다형성
- 오버로딩
- 오버라이딩***객체 지향의 꽃
- 확장성 있는 애플리케이션 : 상속과 오버라이딩
- 추상클래스 / 인터페이스
- 추상클래스는 왜 있어? 인스턴스화도 안되는데??? 상속의 개념을 알아야 함.
- 상속관계에서 부모클래스의 메소드가 구현이 안되는 걸 알지만, 확장성을 위해서 만든다.
- 추상메서드가 하나라도 있으면, 추상클래스이다.
- new가 안됨.
- 추상클래스는 왜 있어? 인스턴스화도 안되는데??? 상속의 개념을 알아야 함.
-
OCP란?
OCP(Open-Closed Principle)란 객체 지향 프로그래밍의 SOLID 원칙 중 하나로, 소프트웨어의 설계를 확장에는 열려있고(Open), 수정에는 닫혀 있어야(Closed) 한다는 원칙을 말합니다. 이 원칙은 소프트웨어의 유지 보수성과 확장성을 높이기 위해 중요한 개념 중 하나입니다. OCP의 기본 개념은 다음과 같습니다: - 확장(Extension)에는 열려 있어야 합니다(Open for Extension): 기능을 추가하거나 새로운 동작을 정의할 때, 기존의 코드를 변경하지 않고도 확장할 수 있어야 합니다. - 수정(Modification)에는 닫혀 있어야 합니다(Closed for Modification): 이미 동작하는 코드를 변경하지 않고도 새로운 기능을 추가할 수 있어야 합니다. 즉, 기존 코드를 수정하지 않고도 새로운 요구사항을 반영할 수 있어야 합니다. OCP는 코드의 재사용성과 유지 보수성을 향상시키기 위해 중요한 원칙으로 여겨집니다. 이를 준수하면 새로운 요구사항이나 변경 사항이 발생했을 때, 기존 코드를 변경하지 않고도 새로운 클래스나 모듈을 추가하여 기능을 확장할 수 있습니다. 이를 통해 코드의 변경이 다른 부분에 영향을 미치는 것을 최소화하며, 시스템의 유연성을 높일 수 있습니다. OCP는 SOLID 원칙 중 하나로, 소프트웨어 설계의 품질을 높이고 유지 보수 비용을 줄이기 위한 중요한 원칙입니다.
- 자바API
class 주차장 {
park(버스 c){
c. 주차하다();
}
//오버로드, 기능 추가
park(포크레인 c){
c. 주차하다();
}
//기능추가
park(스포츠카 c){
}
}
이건 클래스를 수정하며 확장하고 있는 것이고, 좋지 못하다. 에러날 확률이 올라감.
class 주차장 {
park(자동차 c){
c. 주차하다();
}
}
//main
자동차 c = new 버스();
자동차 c = new 포크레인();
이렇게 수정없이 확장할 수 있다.
클래스의 수정 없이 확장하기 위해 부모, 자식으로 상속되었고
어쩔수 없이 부모 클래스의 메소드가 추상메소드로 생성되며 추상클래스가 되었다.
이것을 객체지향에서 SOLID 원칙에 맞춘 확장이라고 한다.
- 상속과 오버라이드가 수정없이 확장하는 기능이다.
-> 인터페이스를 추가하면 확장성이 더욱 좋아진다. ****
인터페이스는 필드가 없고, 메서드 선언만을 포함한다.
- 설계할 때, 인터페이스와 추상클래스를 이용하여 확장성이 있는 프로그래밍을 위해 애쓴다.
객체 지향이 추구하는 것? (개념)
- 재사용한다.
- 현실을 그대로 옮긴다.
- 현실이 도메인이고 여기의 객체를 실행 중인 어플리케이션에 그대로 옮긴다. + 학사관리 시스템에 현실(도메인)을 보면, 학생들이 엄청 많을 것이고, 학생별로 학과, 학년,, 등등이 필요하겠네. 그럼 학생들의 공통점을 뽑아야겠네?(추상화) 이를 바탕으로 클래스 만들어놓고 프로그램 코드에서 적당한 시기(입학)에 객체 만들어서 화면에 표현한다. => 현실반영
### 메모리 영역
- method Area : 우리 코드
- Stack
- Heap : 객체 저장