Confusing things:

개념화된 데이터를 사용하는것

 

코드의 집중화 및 재사용

  • 집중화 : 함수를 생성한 곳만 수정하면 호출한 부분에서는 자동으로 업데이트 된다. (print()메소드를 Program 클래스에서 한번만 적고, 수정하면 호출했던 main클래스의 내역도 자동으로 반영된다. (코드를 줄일 수있다)
  • 재사용: 다양한 프로그램개발에 따른 코드 재사용이 가능하다. 로또 프로그램을 콘솔,웹,앱 등에 맞게 다시 만들 필요없이 Lotto class를 통해 재사용을 할 수있다. (첫번째 사진의 오른쪽)

 

데이터입력과 출력의 분리. 클래스분리

데이터를 만들어내는 부분은 재사용이 가능

다른클래스에있는 함수호출

lotto = Lotto.gen();  Lotto클래스의 gen()함수를 불러와서 lotto에 대입.

성을 붙여서 부르듯이 Lotto.get()로 불러줘야한다.

같은울타리(같은 클래스)에있는 메소드는 메소드이름만으로 호출가능

 

 


실행코드 재사용

새로운 프로젝트 생성 -> Program 클래스생성

함수를 재사용한다는 두가지로 볼 수 있다.

1. 소스코드 재사용 : 소스코드가 모두 오픈되어야 한다.

2. 실행코드 재사용 :컴파일된 결과물을 재사용.(바이너리코드

자바 실행파일 재사용/ jar파일 생성/ 외부 jar파일 추가하기

(소스코드를 컴파일한 결과물.class을 압축하고 재사용 할 예정)

 

jar파일을 libraries에 반영하면 lotto = Lotto.get();하면 정상반영된다.

만약 에러가 뜬다면 기존 jar파일의 메소드가 public으로 설정되어있는지 확인한다. 

gen(), sort()를 직접만들지않고, 컴파일된 압축파일을 이용해 출력이 가능하다.

접근제한자가 걸린메소드를 반영하면 에러가뜬다.
컴파일된 결과물 재사용했을때 정상작동 되는 모습

불러온 gen(), sort()메소드는 소스코드를 확인할 수없다.


구조체 / class 생성 / 데이터를 묶어서 관리

배열을 바로출력 vs 변수로 출력 (구조체)

추가 문제점이 발생한다. int[] 정수배열이 lotto인가 ?

기본형식을 가지는것보다 데이터는 개념화된 데이터가 코드안에 묻어나야한다.

ex, 학생,주문,사원,발주 등 정수배열, 문자배열이겠지만 단위를 묶어서 의미가있는 단위로 쓰는게 바람직하다. (유지보수에도 이점)

개념단위데이터로 표현

Lotto lotto ; 로 자료형을 정의한다.

 

더큰 단위의 개념적인 것을 정의해서 써왔다. (데이터를 묶는것)

다양한 데이터를 Covid로묶은것과 같다

int[] lotto를 Lotto 자료형으로 이용하기위해 main()메소드에서 Lotto lotto; 변수선언한다.

Lotto 클래스안에 담긴것들을 Lotto. 으로 사용할 수 있게된다. 

정수배열 int[]를 담고있는 Lotto라는 개념으로 데이터 단위를 만들어서 한번에 관리한다. 

int[] lotto보다는 Lotto가 바람직하다. 데이터안에 int[]이 다양할 수 있게때문에 혼란이 생길 수있다. 

 

Lotto클래스에 멤버변수가 여러 정수가 있을때 예시

 

객체를 생성해서 호출

 

 

데이터를 묶어서 관리하는 이유

의미를 분명히 할 수있는 자료형으로 해야한다.

각각 String, int를 부르는것보다 stu1식으로 해야 학생데이터인지, 선생님 데이터인지 구분할 수있다.

 

Lotto클래스의 int[]배열을 각각 관리했다면 나중에 유지보수하기 어렵다. 나중에 시간이 지났을때 무슨데이터였는지 기억해내기 힘들다.

Lotto lotto;로 묶어서 사용할것

Lotto라는 자료형을만들어써서 기존의 다른 정수배열과 구분한다. 코드정리

사용자가 원하는 자료형을 명시해서 쓸 수 있다.

하지만 불편함이 두가지 발생한다.

1. 정의하는데 추가 코드발생

2. 계층이 생긴다 lotto.nums[i]로 불러서  써야한다.

 


계층을 두고있는 구조체 사용시 

함수를 흔히 자판기, 블랙박스라고 한다.

우리는 자판기안쪽 구현방식을 알 필요가 없다.

함수구현이 나에게는 몰라도되지만 원하는 기능만 실행하면 된다.

 

함수의 매개변수 이름은 외부에서 사용하는 변수명에 영향을 받지않는다. (지역화,고립화)

계층을 두고있는 구조체를 쓸때 lotto.nums[i]는 지역화가 아니다. Lotto클래스에서 int[] nums;명이 변경된다면 오류가 생긴다.

이름변경에 영향을 받는다
Lotto클래스의 이름을 변경 후 에러발생

외부의 변화에 취약해졌다. 어떻게 해결해야할까 ? -> 캡슐화의 시발점 

+ Recent posts