- 가장 쉬운 FileWriter, FileReader -> BufferedReader(reader)를 쓰고
/
로 파일경로를 주며,IOException
,FileNotFoundException
으로 catch를직접
강제해야한다.- FileWriter는 IOException를 직접 try/catch한다
- FileReader -> BufferedReader는 1) catch FileNotFoundException 2) catch IOException 2개를 예외처리해준다.
- BufferedReader가 readLine()이 있기 때문에 사용한다.
- 다음 라인이 없으면 null을 반환하기 때문에 -> while (업데이트 변수, 결과값 변수 != null ) 로 받아온다.
- 구현체중 택1 객체생성메서드보유 Manager Class (구현X -> 자동분기X, static객체생성메서드에서 분기별retype만
다형성
만 이용)- Manage Class : static 객체 생성 method의 retypeType에 interface다형성을 이용함. 분기는 파라미터로 받아서 직접 if로함.
- 스태틱 of,from처럼 (다형성으로 들어온 하위카테고리들의 구현체들) 객체생성 메서드 (return new 구현체객체 생성)
- retype타입에 Inteface다형성을 이용해서 -> if분기별 return new 구현체 객체하게 한다. -> 분기는 파라미터가 결정한다.
- 파라미터문자열 -> if로 내부에서 직접 분기
- Interface + 통일강제메서드 일단 구현되어. 빈 코드를 채울 메서드를 정의 (public abstract 생략 -> 접근자 생략하자) 5.구현체(통일강제메서드명 + 구현은 자기맘대로 해서 사용할 하위카테고리Class) 구현
- 외부에서는 Manager.스태틱구현체택1생성메소드 -> 구현체객체.통일강제메서드() 로 구현체마다 다르게 사용
- Manage Class : static 객체 생성 method의 retypeType에 interface다형성을 이용함. 분기는 파라미터로 받아서 직접 if로함.
- 상속중인 class들이 기능추가를 위해 I를 구현하되,
구현부는 조합객체-> 조합메서드
가 하도록, 따로조합용 구현체 Class생성
-> 원하는 상속중 자식들이 조합 사용하여 기능추가- 이미 상속하고 있는 하위카테고리Class들에게, 일부카테고리만 추가메서드 제공하기(기능만 추가, 조합구현->자동분기X, 다형성X)
- 추가상속안되니 인터페이스를 구현 but
구현부는 직접 작성안하고
,구현전용 구현체Class 생성후 내부에서 구현
- 추가기능이 들어갈 interface 구현 -> interface 정의 -> 강제통일 메서드 선언 ->
- -> 강제통일메서드 오버라이딩 -> but 구현을 직접안하고, 추가 구현체에게 맡긴다. -> 추가 구현체class 생성
추가 구현체 객체를 내부에 생성(조합) -> 객체.메서드()로 구현부를 채움
.(직접구현안함)
- 강한결합(조합)을 interface로 느슨한결합 만들기(
다형성
-> 넣어준 구현체마다 내부분기별처리)- 강한결합 - 조합객체(B b) 자리를 -> (Interface i)객체로 바꾸고 -> 조합용메서드 정의(B)Class는 interface구현해 구현체 중 1이 되게 만든다.
- interface를 조합 메서드를 가지게 정의한다.
- 이제 인터페이스 객체자리에 구현체Class 아무거나 넣어서 사용한다.
- Enum기본 사용법
- 상수(매핑될값, 혹은, 매핑람다식)
- 매핑될값들을 받아줄
private final
변수들 먼저 생성후 -> 생성자 자동생성 - 그외 자동싱글톤으로 사용할 private 변수 -> public 메서드로 관리
- 내부api
- Enum명.values() : 상수(객체) 배열을 만듬.
- Enum명.valueof("") : string으로 상수명을 적어 , 상수객체 검색
- Enum명.상수객체.ordinal() : 정의한 index 0부터 반환
- 함수형인페는 외부ENum객체. 에서 호출될 수 있으므로
public
- finder는
public static
(객체 노필요, 변수1개값 받아서 검색후 객체 반환)
- Enum + 람다식 활용방법
- 원하는 람다식의 파라미터 -> 반환값에 맞는 함수형 인페를 고르고 변수로 선언함. cf) 람다식 -> 함수형인페.지정메서드()를 오버라이딩 구현해놓은 것.
- <public, not static - Enum객체마다 호출할 람다호출용인페구현메서드 구현> 원하는 람다식의 파라미터 -> 반환값을 선언부로 하고, 파라미터로 함수형인페 속 내장메소드를 호출후 return하는 메소드 구현
- 외부에서는 스태틱finder로 찾은 enum객체.람다호출용인페구현메서드()로 람다식을 호출시킨다
- Enum 활용처
- 분기별 결과값 단순상수 -> 상위 List stream용 isXXX 메서드 제공가능
- 분기별 input입력문자열 -> 람다식 매핑
- 정해진 List들에 name부여 및 검색기능
- 분기별 결과값 단순상수 + 람다식검색기능
- 집계함수별 람다식 저장소
- 똑같은 말(ENum or 문자열변수)에 대한 여러표현(List)를 담아놓고 검색 가능
- 거품정렬: 거품정렬 1루프는, 검사하는 동안 제일 큰놈을 오른쪽으로 보내다가
- 중간에 더 큰놈이 나타나면(정렬깨짐. 그리고 매순간의 정렬일 뿐임.) 그놈을 보내므로,
[[1루프당 제일큰놈1개씩만 맨끝으로 처리]]
돈다. - 거품정렬은
n개라면, n-1번을 반복
해야지, 마지막 0번째 제외 다 정렬되서 , 최종정렬된다.- n-1반복될때까지, 안쪽루프의 끝번호를 1개씩 줄여나가도록 수정하면 더 좋다.
- sort메서드 정렬: array 혹은 list 정렬(구현없이 java가 제공)
arrays
.sort(arr, collections.reverseorder());- list처럼 배열도
integer[]
의 래핑클래스로 선언해야지,내림차순이 적용
된다.
- list처럼 배열도
collections
.sort(numbers, collections.reverseorder());
- 객체를 sort메서드로 정렬
- collections.sort(객체list)하면 에러부터 남
- 객체내부에는 정렬기준을 안정해주므로 collections.sort()못한다!!
sort()
는 는 2번째인자에, <그때그때마다 바뀌는 코드>를 짜서 넣어줄 수 있다.- 그리고
정렬기준을 정해주는 내부메소드
를 자바가 interface로 메서드명 통일 계약해놓았다**- 어려운 부분 다쫘났고, 2번째 인자 이용 +
메서드 제공class? 사용자?에 따라 바뀌는 부분
을통일계약된 메서드이름으로 xxxx()
로 구현해서 써라- 일단
객체는 안돌아가는 상태로 일단 구현
해놨으니 필요에 따라서 2번째 인자 + 인터페이스로 강제한 메소드를 활용해서 구현 - 객체 등 새로운 자료구조를 정렬할거면,
하카class별로 통일된 메서드명으로 짜서 완성시켜라~
- 일단
- 어려운 부분 다쫘났고, 2번째 인자 이용 +
- 즉, 1) 내가
코드를 짜서 sort()의 2번째인자로 넘길
건데, 그 2)코드짤 때, 메서드명을 막쓰면 안되고, 자바가 인터페이스로 통일시켜놓은 메서드명을 써서 구현
sortobjectwithmethod2.java
에 collections.sort()를 모방해서 sort()메소드 자체를 짜보는 연습자바 왈
1 "내가 바뀔수있는 코드를 비워두긴 했지만, 인터페이스로 메서드명은 통일해놨어, 아무렇게 말고 제시한 메서드명을 implements한 뒤 만들어서 넣어줘"자바 왈
2 "sort()에 필요한 comparator(컴패래이터) 인터페이스안에다가 메서드명을 강제해놨어. -> implements한 뒤 메서드명으로 써서 코드를 넣어줘"- 요약) my) 내부바뀔코드를 강제통일한 메소드명을 비워두었어. interface를 구현해서 통일메소드로 원하는 코드 구현해서 구현체만 넣어줘.
- sort()의 2번재 인자처럼,
내부에서 정해진이름의 메소드로 구현할 수 있게 interface 구현체
를 인자로 받는 부분은 - 그 interface를 구현한 class(구현체) 작성 -> 강제된 메소드부분에 커스텀구현 -> 내부에서 사용되어지게 구현체 객체를 대입
- sort의 경우, interface구현체(class) 생성후 compare()메소드 작성주고, 구현체객체 넣어주면, 정렬기준을 원하는대로 할 수 있음.
- 사실 우리는 sort()코드내부를 볼순 없다. 하지만
우리가 관려할 수 있는 부분으로 비워둔 곳
은 interface구현체class를 만들고, 정해진이름을 가진메소드 부분의 구현부
이며 원하는 코드 작성해서 넣어줄 수 있다.
- 사실 우리는 sort()코드내부를 볼순 없다. 하지만
- sort()의 2번재 인자처럼,
실제 객체 정렬에 java제공 인터페이스 사용
in sortobjectwithmethod3- sort()의 2번째 인자를 만들어주기 위해, java제공 comprator 인터페이스를 구현 + <객체t>의 제네릭도 같이 적어주며 구현한다.!
- 강제통일 메소드명 compare()에 원하는 코드를 넣되, 순서대로 오는 인자들을 기준으로 최종 int로 반환해야하는데,
0이상 int 반환시 swap
될 예정이니return -1;을 swap안되는 기준
,return 1;
을 바뀌는 기준으로o1, o2, if분기문
을 작성한다.- cf) 숫자비교: > = < 등의 부+등호
- 문자열사전순비교: 기준문자열. compareto(비교) > 0 크다 = 0 같다 <0 작다
- collections.sort(객체list)하면 에러부터 남
상속과 다형성 요약
: 상카객체에 담는 다형성으로 -><<상카객체 배열>> or <<상카객체를 파라미터로 받는 곳>>
에 넣어공통기능명 일괄처리
but공통기능 수정사용(override)으로 내부에서 분기별 처리
추상메서드와 추상클래스
: 하위 카테고리class별 내부 분기처리 일괄로 & [강제로 수행]하기 위해서- [일반class의 상속]이 아니라 상카의 [구현부삭제된 공통기능 메서드]를 반드시 오버라이딩해서 써야하는 [추상메서드 in 추상클래스]를 만들어 상속한다.
- 구현할내용이 달라서(하카별 내부분기처리 예정) 당장 결정할 수는 것들 -> abstract메서드라고 생각하자.
- 모든 메소드가 추상메소드(1개 이상)인 것을 -> 추상클래스가 아닌 interface라 부른다.
인터페이스
: class간 의존하고 있는 메소드를 <미완성 됬을지라도, 변경될지라도 일단interface에 메소드명 선언하고 넣고(func명 통일계약) -> implements(메서드제공사에서 계약동의)후 일단 구현해
> 해서 의존되고 있는 메소드를 타 클래스에서 호출가능하게 구조를 짜게 해준다.- my)
interface
: 하카별 func(메서드)명 통일 계약 ->하카 implements
(하카들(메서드 제공사들)의 메서드명통일계약 동의) - a -> b의 methodb()를 의존하고 있다면?
- b가 언제구현될지, 완성될지 모르므로,
미완성된 체 구현해!
의 의미로interface에서 func만 추상메서드로 정의
- b는 미완성이라도, 나중에 변경될지라도
interface를 구현 후 추상메서드도 일단 구현
- a는
강제로 미완이라도 methodb를 구현한 b
클래스의 객체 -> 메소드 사용하여완성됬다 가정하고 b메서드 호출
할 수 있게 된다.
- b가 언제구현될지, 완성될지 모르므로,
- my)
인터페이스2
: aclass가 의존하던 대상인 bclass의 메소드를 interface에 넣어호출방식을 강제
&미완성이라도 일단 해당메소드 이름으로 구현
시켰으나- my) 여기서
미완성, 일단 구현, 바뀔수 있는 메소드
의 구현부는 내용이 바뀔 수 있으며,a는 완성되었다 가정하고, 의존메서드b 사용
했다.- but b -> c class메소드로 변경하면,
보통은 메소드를 제공하는 방식이 다르기 때문
에,의존class를 바꾸면
a->c 메서드 호출시에코드가 바뀐다.
- but b -> c class메소드로 변경하면,
- a(충전기개발회사) 다른 핸드폰(b,c,d)의 충전기 타입(method)을 의존하여 개발하고 싶다면?
- 각 핸드폰별(하카별) 공통 충전기타입(method명 통일 -> 공통기능으로 가지도록 상카 뽑고 -> 다형성으로 일괄처리하면 -> 하카별 내부 분기처리)을 만들어서, 객체종류(핸드폰 종류만)만 바꿔 개발할 수 있게 해야한다.
- 공통 충전기 타입 쓴다?
a가 의존할 메서드를 제공하는 b,c,d클래스들
이 메서드명을 통일(구현부만 각자 다르게) byinterface
- 꼭 func명(제공하는 기능명)을 통일 안하는 class는 있다.
- 메서드제공하는 여러 class들(하카별)에게 [interface라는 계약서]에 [기능명, func명]을 통일한다.
- 계약 따르는 class만 implemens로 [계약을 따른다]
- my) 여기서
공통기능
을 가졌고, 일괄처리를 원한다면?상속
을 이용한상위-하위카테고리
만들기- 하위카테고리는 굳이 공통기능을 구현안해도 상속되어있다.
다형성
을 이용해서상위카테고리 참조변수
에하위
카테고리객체를 담기
- 같은 객체type(참조변수)기 때문에, 상카class[]배열에 1type으로서 배열을 만들 수 있다.
반복문
으로 공통기능을 일괄처리하기- 오버라이딩을 통해, 상속받은 공통기능을 다르게 구현할 수 있다!
- 메서드이름만 같으면 공통기능-일괄처리는 유지되기 때문에
상속으로도 다르게 구현해도 다형성 일괄처리가 가능
하다.
- 메서드이름만 같으면 공통기능-일괄처리는 유지되기 때문에
- 오버라이딩을 통해, 상속받은 공통기능을 다르게 구현할 수 있다!
- 실전 적용시
article
과reply
객체를파라미터
로 받아 동일 기능하는 메소드를 통합하고 싶다- 다형성을 위해 baseclass, 상위카테고리class를 생성한다.
- 상속되는 변수들은 지워준다. class명을 basexxx-> 2가지(articlexxx, replyxxx)를 뻗어나가게 수정해준다.
- 메소드 2개를 1개로 통합하고,
파라미터
로는다형성
으로서상카class객체
를 받도록 수정해준다.
- 다형성을 위해 baseclass, 상위카테고리class를 생성한다.
member
->기존
과 동일한 일반멤버(generalmember
) +추가 변수
(point등), 메소드를가지면서 따로 관리하고 싶은 하카class
를 만들고,다형성으로 일괄처리
하되,분기별 달라지는 코드를 공통기능(메서드) -> 상속후 수정사용(override) 구현
한다.
- 요약) 자식class:
1)상속
으로 부모 변수+메소드(기능) 물려받으면서, +2)method추가ormethod오버라이딩
으로기능 추가
or기능 수정(재정의)
한하위 카테고리
를 만드는 것 - 요약2) 오버라이딩시 switch변수 활용(isturbo 등 하위카테고리만의 기능 사용유무를 관리하는 상태) 등으로 메소드 재정의, 수정 중에 , 부모꺼 그대로 사용하는 분기 일 떄,
super.메소드()
사용. - 요약3) 새로운기능을 위해 상속 + 새로만든
하위class
지만,상위class 참조변수
에 담기면서공통기능(method) or 수정재정의된 공통기능
까지 호출될 수 있다. ->다형성
- 새로운기능을 가질 수 있는 하위카테고리들이지만,
같은 상위카테고리에서 파생된 자식들
을공통기능 or 수정(재정의된 공통기능)
만 사용해서 똑같이 다루기 = 일괄처리 (ex> 배열에 담아서 같은 메소드 호출)할 수 있다 - 공통기능 or 수정된 공통기능만 쓸 건데, 다형성 안쓰면.. 일일히 상카객체.숨쉬다(), 고양이.숨쉬다(), 강아지.숨쉬다() -> 일괄처리없이 모두 수동으로 100개 다 호출시켜줘야한다
- 하위개념들을 상위개념으로 다룰 수 있게 되면(다형성) -> 통일된 방식(배열->반복문->일괄처리)으로 여러객체를 다룰 수(공통기능 or
하위개념들은 자신만의 수정된 공통기능들을
) 있다.
- 새로운기능을 가질 수 있는 하위카테고리들이지만,
- 공통 기능외에 (모두가 아닌)
추가 기능을 가진 객체
를 따로 만들고 싶다? - -> 요약) 공통기능class를
상속
한,새class
에 새method 작성해서 사용하도록하위 카테고리
만들어주기- <구체적 기능을 가진 하위카테고리> 를 만드려면, 바로 작성하면 모두 기능 가져버림. no 하위 카테고리
- 공통기능 카테고리 상속한 특정 기능 class(특정기능 == 하위카테고리 class 생성)를 따로 만들어서 객체 생성해줘야한다.
- 상속 -> 공통 데이터묶음(인스턴스변수) + 공통 기능(method)들을 다 받아온다.
- 새로운 class -> 해당 새class 객체만 해당 새 기능(method)작성한 것을 사용할 수 있음.
- 공통 기능 상속의 이점 : 공통 기능을 수정하면 -> 상속한 하위카테고리(특정 기능 객체들)은 자동으로 수정됨
- 하위 카테고리는 상속을 통해 공통변수 + 공통method를 자동으로 받았음.
- 자동으로 받은 상태+기능들은, 공통class 부모class 수정시 자동으로 수정됨
- 그대로 물려주니까~~ 수정해도 수정된 것을 물려준다~
- -> 반드시 공통기능/필수기능은 부모, 상위class로 만들어놓고 특수기능, 추가기능, 구체적 기능 상속한 새class로 하자~
- 반대로 고양이, 강아지의 공통개념들(변수들+메소드들)을 뽑아내는 것을
추상화
->부모class
로 뽑아낸다고 한다.- 저마다의 개성을 뽑아낸 것은 상속후 method들(새기능)을 추가한
자식class
- my) 추가기능을 method로 추가한 것이
extends한 자식class
: 부모class 변수&메소드에 +메소드 추가
한 것 - my) 자식들 -> 아~! 새로운 메소드 추가로 새로운 기능들 추가된 하위카테고리구나..
- my) 추가기능을 method로 추가한 것이
- 저마다의 개성을 뽑아낸 것은 상속후 method들(새기능)을 추가한
- my) 자식들 -> 새로운 기능(method) 추가 뿐만 아니라 상속후
기능(method) 수정 or재정의(override)
한 것도 자식class다.- 만약 부모자동상속 method를 오버라이딩 안하고 정의했으면? ->
자신에게 있는 메소드가 1순위
-> 없으면 부모가 상속해준 것 찾는 것.
- 만약 부모자동상속 method를 오버라이딩 안하고 정의했으면? ->
- my) 상속후 메소드추가 or 재정의 뿐만 아니라
상속후 변수(데이터) 추가
하여 활용하는 것도하위카테고리, 자식class
다.부모에게 없던
인스턴스 변수(객체단위로) 스위치변수 추가
-> override(공통(부모) 기능(메소드) 수정)시 활용할 수 있다.- boolean isturbo = false; 추가 선언후 -> on, off 메소드 만들기 + 삼항연산자로 switch변수만들기
- @override 부모 원래 기능에 -> swtich변수 on일때만 새로운 기능 수행
자식에 switch변수를 추가후 override
해서 하는 것은 여러메소드를 물려받은 경우, (대부분은 물려받은대로 쓰되)일부만 고쳐쓸때 유용하게 사용한다.
@override했는데도(수정, 재정의로 들어왔는데)
switch변수 off로부모상속받은 것을 그대로 사용
해야할 때 ->super.메소드()
;- 재정의, 수정시 분기별로, 부모꺼 그대로 사용해야한다면 super.메소드()를 활용한다.
- 다형성: 한 객체가 다양한 형태로(하위class지만, 상위class 참조변수에 담기면서 공통기능(method)만 호출될 때)
- 하위카테고리라도
수정, 재정의된 공통기능 포함
공통기능만을 다룬다면, 상위 카테고리로서 다루어질 수 있다.- -> 다형성으로서
부모class 참조변수
에 담긴다.
- -> 다형성으로서
- 대신 개별 추가/수정된 기능(메소드)은 포기해야한다(에러남) -> 재정의된 공통기능은 가능
- -> 부모class(상위카테고리)참조변수에 담겼다면,
하위카테고리만의 새로운 기능(method)호출이 안된다.
- -> 부모class(상위카테고리)참조변수에 담겼다면,
- 하위카테고리라도
- 클래스: <기능, 데이터처리를 할 수 있는> 메소드들과 <1단위에 포함되는 여러 변수 ==
데이터들의 묶음
(데이터들은 수백수천개라 묶어서써야함!)>. 메소드들은 클래스를 통해 기능발휘할 수 있음.- 클래스도 하나의 타입이 된다. person p -> 클래스type의 배열도 만들 수 있다.
person[] people = new person[5]
- 향상된 for문에 null 객체(배열 속 대입안해줘서 null)가 있어도 에러는 안난다. 하지만 배열에 값을 초기화 안해준 것을 접근하면 에러난다.
- 클래스도 하나의 타입이 된다. person p -> 클래스type의 배열도 만들 수 있다.
- 기능: 데이터가 있어야하고(in class), (in method안에서) 데이터를 처리해서 기능을 함.
- 데이터는 메소드(지역변수)가 아닌 class에서 변수로 만들어쓴다.
- 유틸변수로서 매번 똑같은 값 쓸 변수만 static으로 정의해준다.
- 메소드로 뺄 때, 빨간줄의 변수들 -> 매번 바뀐다. ->
파라미터
로 넘겨주거나 or **모든 메소드에서 동일 == 모든 객체에서도 동일하다. 지역변수 -> 공통의클래스변수
**가 되게 한다. - 변수들의 묶음, 데이터의 묶음(변수 여러개가 1단위) -> 같이 들고 다닐려면 묶어야함. -> class
- 데이터는 메소드(지역변수)가 아닌 class에서 변수로 만들어쓴다.
- 메소드의 여러 파라미터 -> 객체라면 객체 1개만 받아서, 내부에서 객체.인스턴스변수를 뽑아서 처리하자.
옮길때는 통째로 옮겨야함!
- 스태틱:
공유
목적의 자원. 변하는 인스턴스가 아닌class에 생성되서 보관되어야
공유됨. main등의 static 공유자원은, class속 static붙은 공유 자원밖에 못씀. -> 메인에서 개발은x- class-> 객체1, 객체2, 객체3, ..., 객체10 -> 모든~ 객체가~
공유
되려면, static붙은놈은class
안에 있어야겠다~ ->static
- 메인에서 개발이 아닌 -> 속성(상태) 데이터묶음 + 기능들묵음의 class로 표현하고 싶은 것을 표현해야함.
- class-> 객체1, 객체2, 객체3, ..., 객체10 -> 모든~ 객체가~
- 클래스 static(공유)변수로 counting하는 객체 생성 갯수
- 생성자는 객체초기화 외에, 객체생성시 작업코드를 넣을 수 있다. -> count++; 가능
class설계도에 넣어놓는
공유
변수,결과값을 모든 객체가 공유
하는 변수 ->static
int count = 0;선언 가능.- 그림 생각하기~
- 객체를 만들기
class 파일을 새로
만든다!! 메인에서 정의 x ->default 인스턴스 변수
데이터 묶음들 선언- 메인메소드가 있는 곳으로 가서 생성하기
- 생성자: 객체는 초기화하고 난 뒤에야 의미가 있다. -> 인스턴스변수가 10개나 된다면? -> 객체 초기화를 객체한테 맡기자.
2. setdata(여러, 파라, 미터); ->
객체 생성시마다 아래line에 도.. 객체.setdata(파라,미터); 해줘야하는 번거러움
-> 생성자에서 생성과 동시에 데이터 초기화 해주자. 3. 생성자는 객체생성시 자동호출되며, setdata대신 바로 인스턴스변수들을 생성과 동시에 초기화할 수 있다.- 객체 초기화 뿐만 아니라,
객체생성시 실행되어야하는 코드
가 있으면 다생성자에 넣어주자
.
- 객체 초기화 뿐만 아니라,
- arraylist에 제네릭: 원소들의 타입e(lement들 type정하기 by 제네릭) int -> <
integer
>로 기입해야함. - 핵심기능 5가지
- .size() 0부터 -> add, remove시마다 수시로 찍어주자.
- .add() -> 한번에 하나씩 밖에 못 넣는다.
- .set(index, value) -> list는 배열이 아니므로 list1[1] = 2;
인덱싱 안됨!!
- .get(index) ->
인덱싱안됨.
- .remove(index) ->
삭제후 알아서 index땡겨지는 것 조심
.remove(값)
도 가능하다! 문자열일때?
.indexof(값)
도 가능하다.
- if조건에
||
사용해보자~ - 데이터저장을 길이가 정해진 배열 -> arraylist로 바꿔보자.
- 갯수제한이 없어졌다.
- add/delete마다 index관리 -> 알아서 조절된다.
- add시
.size()-1
로 제일 최근 index를 얻어서 처리해도 된다. - delete시.. 일반배열이면,, i 삭제 -> i+1이 i를 덮어쓰기로 한칸씩 왼쪽으로 당기기..
- 맨마지막은 null?
- add시
- main의 기능들을 메소드로 빼기
- 내용 잘라내기 (분기문이면 return, continue, break 제외)
- 함수(); 작성
- 자동완성
- 없다고 빨간줄 뜨면 파라미터로 넣어주기
- 빼고 있는 거의
모든 메소드들이 원하는 인자
-> 파라미터로 넘기지말고,main = controller 메소드 밖
의 모든 객체, 클래스 단위(==메소드들한테도 공용
)공용 변수static 클래스변수
로 빼준다.- my) 메소드들 공용 사용이면, (like 객체마다 결과값 관리(x),
모든 객체 공유하는 결과값 -> static 변수
== )클래스내 모든 메소드들 공용 사용 -> 파라미터로x -> static 변수로빼서 class내서 막사용
- 주로 list(data), scanner 같은...
클래스내 메소드의 공용 변수라고 판단된 순간 -> 파라미터x -> static으로 빼서 막쓰자.
- my) 메소드들 공용 사용이면, (like 객체마다 결과값 관리(x),
프로그램 무한반복 입력 구조짜기
- 무한반복의 입력 -> 안내멘트 -> 종료조건까지 완성- while (true) -> if () break; 미리작성 주석 :
무한반복시 종료조건 먼저 작성해두기
- scanner.nextline() -> test -> 안내멘트 -> 종료조건 입력
- if (종료조건채우기) -> 종료 멘트 -> test
- while (true) -> if () break; 미리작성 주석 :
- 각 커맨드마다 else없이 if문으로 분기한다. -> 공통코드~~ ~~없으면 분기마다 continue도 필요없다.
- {}중괄호가 영역으로서 지역을 의미한다. -> 각 if {}분기문마다 공유할 수 있는 변수는 {}지역을 벗어나서 빼서 만든다.
- 밖에서 변수 만든다는 것:
default값으로 초기화
-> {} {} 영역마다 할당해서 사용 -> 사실= null;
로 초기화하는게 좋다.
- 밖에서 변수 만든다는 것:
- 반복문에 의한 초기화를 배제하기 위해 ->
반복문 밖
에 만든다.
- {}중괄호가 영역으로서 지역을 의미한다. -> 각 if {}분기문마다 공유할 수 있는 변수는 {}지역을 벗어나서 빼서 만든다.
저장변수, 데이터 변수 등은 null로 초기화
해야,, delete나 값이 없을 경우 if로 확인해서.. 멘트 출력시 쉬워진다.데이터 없음을 표현
하는 방법은 null로 초기화 하는 것delete
== 데이터를data = null
로 넣어준다.- 비어있는 데이터확인은
if ( data == null )
로 편하게 한다.
- 각 분기의 if들마다 안걸렸을 때의
예외처리
를if ~ continue or return
에 안걸리는맨 뒤에서 공통 처리
해준다.- else를 쓴다면 if -> else if 들로 연결 -> 최종 else에는 예외처리
- else를 안쓴다면
if 무반종료필터링break
이후 -> if continue(return)-> if continue(return)-> ... ->정해진 분기에 안걸린 예외
는 continue or return도 안당했음.if분기 없이 맨마지막 공통코드
로 적어버린다.- 원하는 분기에 걸렸으면 continue에 걸려서 다음루프 이미갔음!!
지정한 분기에 걸리지 않은 것들 싹다==예외들
맨 마지막에 남아.. 처리됨.- 어차피 루프끝나기 직전이라, 다음 루프가서 입력받게 될 테니
잘못된 입력입니다.멘트
만 날려준다.
- my) 모든 각 분기if문 속의
continue; or return;
를 보고 ->그 뒤엔 if분기들 이외의 (if굿 ->)예외처리 or (if쓰레기->)공통코드가 있을 것
이다. 생각 - 분기(if break, if continue ~) -> 마지막 예외 패턴 말고 vs
if not (필수조건) continue
의필수조건못지킨 예외는 건너띄기
작전도 있다.
- 데이터 변수 -> 배열로 저장시 주의점
- 배열부터는 for를 통한 데이터 read를 하므로 -> if (data == null ) 같은 빈 데이터 처리는 .. 안해도된다.
- 주의) 배열.length로 데이터 빈것 확인? -> 주의) new 배열[] 초기화시
.length
때리면고정으로 n개
로 뜬다! null이 3개 차있다..로..- 그냥 for돌려서 0개면 아에 안돌아가니 ... 알아서 처리되도록 하자?
- 주의) 배열.length로 데이터 빈것 확인? -> 주의) new 배열[] 초기화시
- add/delete시에는 index관리를 따로 해줘야한다. -> int index = 0부터 시작하는 변수필요
- 배열부터는 for를 통한 데이터 read를 하므로 -> if (data == null ) 같은 빈 데이터 처리는 .. 안해도된다.
- 반복문을 break가 아닌 for문에서 continue 특정 회차(들)만 건너띌 때
- 로또 번호를 뽑을 때, 중복없이 서다수 뽑을 때,
뽑은 번호다? 중복번호 뽑지말고 건너띄기
- 중복제거할 때, 담으면서 + continue를 기본으로 쓰는 것 같다.
ex>짝수만 뽑기: 전체 중에 일부 -> 전체 중에 아닌것을 if not continue
ex>중복제외 뽑기: 끝모른체 전체 중에 찰때까지 -> 전체 중에 중복이라면 if continue하면서 찰때까지 반복
- 로또 번호를 뽑을 때, 중복없이 서다수 뽑을 때,
- 실수값을 반환받으려면, 10/3 ->
10.0
/3 으로최소 소수점찍힌 실수 1개
를 준다.- 그러나
변수에 담긴 int
들을 계산하는데, double실수값으로 받아야 할때는?- 직접 소수점 못찍어준다 -> 최소 1개는 소수점 찍히도록 double형변환 해줘야한다.
- 그러나
- 자동형변환은 안전유무를 따져서 작-> 큰것에 넣을 때만 자동형변환됨.
- 큰 -> 작은 것에 넣을 때는, 강제로 수동형변환 시켜줘야한다 (int) 큰 -> 작
- 난수뽑기 자바api 2개
- math.random() + (int) : 0
0.999 default로 09, 099, 0999- (int) 담에 결과값 전체를 괄호쳐줘야함.
- new random().nextint(n) : 0~n-1까지의 난수 1개 발생.
- math.random() + (int) : 0
- 메서드: 중복되는 코드(기능)를 재활용하며 값 바꿔쓰기
- 변수: 중복되는 값을 재활용하며 바꿔쓰기
- 주의: 메서드안에 메서드를 만들순 x 클래스가 메서드 모음집임.
- list가 아닌 배열에 원하는 원소만 모을 때, 원하는 원소의 갯수를 먼저 따로 세서, 담을 배열의 갯수를 미리 알고 있어야하므로,
- 짝수만 for문으로 확인하면서 담고 싶을 때 -> 짝수 갯수 확인용으로 for문을 먼저 한번 돈다.ㅠ
- 문제는 또 다시.. 원본배열돌면서 짝수일 때, 줄어든길이의 배열에 순서대로 넣어야하는데, add가 안되므로 0부터 추가할때마다 index변수+1씩하면서 채워줘야한다.
list
는 빈 list에 .add만 해도빈배열초기화
+알아서 순서대로 추가
-
숫자입력도 nextline()으로 먼저 받고 -> parseint -> int 처리(nextint()ㄴㄴ)
-
while 반복문은 if에서 파생된 것으로 조건변수를 이용하며, 보통은 증가시킨다.
- 조건변수는 while문r 에서는 미리 /ㅠ 'while문 위에 생성한 뒤, 반복문마다 update되어야한다.
- 또다른 방법: while (true) 무한반복문 ~~+ if break를 써서 종료시킨다.
- my) if확인 직전에 update가 되어야~~하므로,
- update는 자체처리후 맨 마지막에
- if검사는 while (true)에 시작하자마자 주기
- 내부에 if가 들어가야하므로 또 조건변수가 필요하긴 하다. 둘중에 편한거 쓰기.
- my) if확인 직전에 update가 되어야~~하므로,
-
응용구구단: 구구단도 일단 기본 구구단 작성해놓고 변수로 바꾸기
-
배열: 변수와 달리 숫자를 부여해놓고
반복문 속 숫자로 일괄처리가 가능
해지는 것이 제일 큰 특징- for의 작성은 for () {} 부터 만들어놓고 조건식을 적자.
- i <= 9보다는 i < 10을 권장하는 이유는 10이 배열의 길이를 의미하니까
- 일반배열은 초기화시 배열길이가 결정되기 때문에, 입력받아 넣을 예정이라고 해서
{};
로 0개짜리 배열로 초기화하면 안된다.- 배열에 저장할 거면, 생성시부터 몇개짜리배열인지 알려줘야한다.
- 입력도 출력처럼 for문으로 배열길이만큼 돌면서 nextline()대기시켜주면 되는데, 100개가 넘어간다면?
- 배열 길이 정해졌다면, 배열 초기화는
new type[length];
- int는 0으로채워짐 / string은 null로 채워져잇음.ㅋ
- 배열 길이 정해졌다면, 배열 초기화는
- 거꾸로 출력하려면 length-1 ~ 0까지...
for (int i = arr4.length-1 ; i >=0 ; i--) {
- 여기서는 시작시
n-1
index와>=0
등호를 이용해서 끝점을 나타내줌. - 증가시에는
0
index와< 길이
와 부등호만
- 여기서는 시작시