| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 서비스레이어
- PointCut
- springjdbc
- @Valid
- springmvc
- frontController
- 생성자주입
- application.properties
- 바인딩변수
- Java
- after-throwing
- MVC
- SpringBoot
- gradle
- AOP
- 의존주입
- c:if
- 유효성검사
- produces
- .xml
- @RequestParam
- @ResponseBody
- 어노테이션
- spring
- @
- 스프링
- 비즈니스레이어
- jointpoint
- @RequestMapping
- Model
- Today
- Total
메모장
오답노트 01. 본문
<객체 지향 프로그래밍의 특성 >
1.추상화
추상화란 예를 들어 , A클래스, B클래스, C클래스가 있다고 했을때 !
여기서 각 클래스 안에는 각자의 필드와 메서드가 있을것이지만
추상클래스는 A클래스, B클래스, C클래스들 간에 비슷한 필드와 메서드를 공통적으로 추출해 만들어진 클래스다.
'키보드'라는 클래스가 있다. '키보드'를 만드는 제조사는 여러개이다. A제조사, B제조사, C제조사는 각 제조사만의 스타일대로 키보드를 제작하고 소비자들에게 제품을 출시한다.
ex) A제조사는 키보드를 누를때 마다 불빛이 들어온다.
B제조사는 키보드를 누를때 딸깍 거리는 소리가 난다.
C제조사는 키보드를 누를때 살짝만 눌러도 잘 눌린다.
여기서 이 키보드들 간에 공통점은 무엇일까? 바로 키보드를 누른다! 라는 액션! 즉 메서드가 공통적이다. 그럼 이 메서드를 추출해서 추상클래스 안에 두면 된다. (키보드를 상속받아 탄생한, A키보드, B키보드, C키보드)
공통적인 변수를 추출 하여 추상클래스를 하나 선언한다. 실체 클래스는 실제 구체적인 클래스를 의미한다. 사람마다 다 다르지만 공통적인 부분은 추상클래스 , 실제적이고 구체적인 부분은 실체 클래스로 구분 하고 둘은 상속관계이다.
ex) 너는 웃지만 입을 가리고 웃고 , 나는 웃지만 덧니가 보이고 , 너는 웃지만 박장대소를 하고
웃는다는 공통점 ! 메서드가 공통된 부분 이 부분은 추상 클래스 , 구체적으로 입을 가리는지 덧니가 보이는지 박장대소를 하는지 ---> 실체 클래스
추상 클래스의 3줄 요약 (abstract)
1. 추상클래스는 실체클래스의 공통적인 부분(변수,메서드)를 추출해서 선언한 클래스
2. 추상클래스는 객체를 생성할 수 없다! 아직은 실체성이 없고 구체적이지 않기 때문에!
3. 추상클래스와 실체클래스는 어떤관계? 상속관계!
abstract class Pokemon{
abstract void hello();
}
class Pika extends Pokemon{
@Override
void hello() {
}
}
class Kkobugi extends Pokemon{
@Override
void hello() {
}
}
2.캡슐화
연관된 목적을 가지는 변수와 함수를 하나의 클래스로 묶어 외부에서 쉽게 접근하지 못하도록 은닉하는 것이다.
캡슐화는 중요한 데이터를 쉽게 바꾸지 못하도록 할 때 사용한다.
캡슐화를 하는 가장 큰 이유는 정보 은닉이다.
캡슐화를 통해 외부에서 내부의 정보에 접근하거나 변경할 수 없게 직접적인 접근을 막고
객체가 제공하는 필드와 메소드를 통해서만 접근이 가능하다.
이렇게 접근을 제한함으로써 유지보수, 확장 시 오류의 범위를 최소화, 데이터가 변경되어도 다른 객체에 영향을 주지 않아 독립성이 좋다.
캡슐화는 접근제어자를 통해 이루어진다.
* JAVA 의 접근 제어자
public : 접근 제한 없음
protected: 동일한 패키지 내에 존재하거나 파생 클래스에서만 접근 가능
default : 아무런 접근 제한자를 명시하지 않으면 default 값이 되며, 동일한 패키지 내에서만 접근 가능
private: 자기 자신의 클래스 내에서만 접근 가능
class Book{
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
} // getter , setter 메서드 사용
3.상속
class Person{
String name;
}
class Student extends Person{
}
public class TEST {
public static void main(String[] args) {
Student student=new Student();
System.out.println(student.name);
}
}
// 상속 : extends 를 사용하여 상속받고 자식 클래스의 객체가 부모클래스의 멤버변수에 접근할 수 있다.
4.다형성
class Shape{
String name;
double area;
void draw() {
System.out.println("모양 그리기");
}
}
class Circle extends Shape{
@Override
void draw() {
System.out.println("원 그리기");
}
}
class Rectangle extends Shape{
@Override
void draw() {
System.out.println("네모 그리기");
}
}
public class TEST {
public static void main(String[] args) {
Shape[] datas=new Shape[3];
datas[0]=new Shape();
datas[1]=new Circle();
datas[2]=new Rectangle();
for(Shape v:datas) {
v.draw();
}
}
}
// 다형성의 대표적인 특징 : 오버 라이딩을 사용하여 자식 메서드의 결과값이 호출된다.
발견할 수 있는 에러 찾아보기
1 public static void main(String[] args) {
2 ArrayList datas=new ArrayList();
3 for(int i=1;i<=5;i++) {
4 datas.add(i); // [1,2,3,4,5]
5 }
6 int total=0;
7 for(int v:datas) {
8 total+=v;
9 }
10 System.out.println("total: "+total); // total: 15
11 }
//이 문제에서 발견할수 있는 에러 : 7번 라인 forEach문을 사용할때
//for(데이터타입 변수이름 : 배열변수이름)으로 작성해야 하는데
//ArrayList 배열의 타입인 제네릭이 명식되어 있지 않다 .
//2번 라인에 제네릭을 작성 해줄것 ! <Integer> 정수타입 이므로
//for(Integer v : datas ) <==> for(int v : datas) 서로 같은 식이다
ArrayList 배열 과 예외 처리 이해하기
public static void main(String[] args) {
ArrayList<Integer> datas=new ArrayList<Integer>();;
datas.add(-5);
datas.add(-1);
datas.add(0);
datas.add(1);
datas.add(5);
System.out.println(datas);
for(int i=-1;i<5;i++) {
try {
System.out.println(10/datas.get(i));
} catch(Exception e) {
if(i<0) {
System.out.println("HELLO");
}
else {
System.out.println("JAVA");
}
}
}
}
ArrayList 배열 datas 에 숫자를 추가한다. { -5,-1, 0, 1, 5}
for문이 -1 부터 시작 하여 i < 5까지 돈다
디버깅 표 그려보기
i i<5 10/datas.get(i) i<0 이거나 i>=0
-------------------------------------------------------------------------------------------
-1 T 10/datas.get(-1) T HELLO // i가 음수라서 trycatch문에 걸린다.
0 T 10/datas.get(0) =>10/-5 F trycatch문에 안들어가므로 결과값 -2
1 T 10/datas.get(1)=>10/-1 F trycatch문에 안들어가므로 결과값 -10
2 T 10/datas.get(2)=>10/0 T JAVA //0으로 나눌수 없어서 trycatch문에 걸린다.
3 T 10/datas.get(3)=>10/1 F trycatch문에 안들어가므로 결과값 10
4 T 10/datas.get(3)=>10/1 F trycatch문에 안들어가므로 결과값 2
생성자와 부모클래스 자식클래스 이해하기
class A{
A(){
System.out.println("야옹");
}
A(String msg){
System.out.println(msg);
}
}
class B extends A{
B(){
super("어흥");
}
B(String msg){
super(msg);
}
}
class C extends B{
C(){
super("멍멍");
}
C(String msg){
super("삐약");
}
}
public class TEST {
public static void main(String[] args) {
C c=new C();
}
}
C -> B -> A 순으로 상속을 받고 있다. C클래스는 c라는 객체를 만들어 생성자를 호출하고 있다.
C 는 부모생성자에서 받아온 String msg를 실행 시킨다.
사진 설명을 입력하세요.
이렇게 쭉쭉쭉 올라가서 System.out.println();을 만남으로서 멍멍 출력 !