-
221208 자바2(반복문, 배열, 객체지향 프로그래밍)스타터스 백엔드 3기 2022. 12. 8. 16:20
하루입니다.
ForTest, MainTest, StudentTest
복습
기본형 변수 : 스택에 실제 리터럴값을 저장한다. 참조형 변수 : 스택에 주소값을 저장한다. 연산자 : 형변환연산자
- char c = (char) 10;
- boolean 제외
- byte short int long float double 이 방향대로면 자동형변환되어, 형변환연산자 생략가능하다.
char int long float double
- 형변환 연산자가 생략 불가한 경우는 명시적 형변환 . 강제형변환 / 다운캐스팅이라고 한다.조건문 : if문과 swicth문
- int kor = 100; 에서 kor = 39; 로 변경하면 계속 컴파일된다.
- 하지만 동적으로 값을 생성하거나, 직접 입력받는다면 컴파일되지 않는다.
- ScoreTest.java의 점수 변수들을 랜덤값으로 바꾸겠다.
- 동적생성방법
double d = Math.random(); // 0.0와 같거나 크고 1.0보다 작은 난수를 생성한다. double d1 = Math.random() * 100; // 0.0와 같거나 크고 100.0보다 작은 난수를 생성한다. int d2 = (int)(Math.random() * 100); // 0와 같거나 크고 100보다 작은 난수를 생성한다. // (99까지만 나옴) int d3 = (int)(Math.random() * 100) + 1;// 1와 같거나 크고 101보다 작은 난수를 생성한다. // (100까지만 나옴) int d3 = (int)(Math.random() * 범위) + 시작값; 로또 번호를 만든다면? (int)(Math.random() * 45) + 1;
자바의 반복문
for while do-while for(int i = 1; i <= 10; i++) {
내용
}int i = 1;
while(i <= 10) {
System.out.println(i); 무한루프
}
while(i <= 10) {
i++;
System.out.println(i);
}
int i = 키보드 입력;
while(true) { true 주면 시작은 한다.
int i = 키보드 입력;
if(i == 13) {} break;
}int i = 11;
do {
System.out.println(i);
i++;
} while (i<= 10)언제 시작하고, 언제 끝나고, 어떻게 변화하는지 지정한다. 언제 끝나는지만 지정한다.
사용자가 키보드 입력값으로 "제목" 입력할 때까지 돌리거나 이럴 때 사용한다.
if문 없으면 무한루프된다. (true)를 받으니까. 보통 무조건 시작하게 (true)를 넣고, 멈출 수 있는 수식 break를 넣는 형태이다.무조건 한 번은 수행한다. 자바의 이동문
break continue 1. switch 블록 내부에서 사용: swicth 블록 내부 문장의 수행을 종료하고 블록 다음 문장으로 이동해라.
2. for, do-while, while 반복문 블록 내부에서 사용 : 반복을 종료하고 블록의 다음 문장으로 이동해라.2. for, do-while, while 반복문 블록 내부에서 사용 : 반복을 종료하고 블록의 처음 문장으로 이동해라. 남은 반복은 계속 수행해라. if( ) break;
if( ) continue;
이런 식으로 블럭 안에 1문장만 있는 경우, { } 생략 가능하다.
배열
- 참조형 변수는 stack 저장 크기가 동적이다. heap 영역 동작 크기의 실제값을 저장하고 stack 에 주소값을 넣는다.
- 배열 : 동일 타입의 데이터를 여러개 모은 것이다. 참조형 변수이다.
- 자바스크립트의 배열은 갯수도, 타입도 유동적이었다.
- 자바의 배열은 갯수도, 타입도 비유동적이다.
int i; 변수 선언
i = 100; 변수값 초기화 (변수값을 할당한다.)
int i = 100; 변수의 선언과 초기화를 동시에 한다.
배열 선언
1. 동일 타입의 데이터를 여러개 모은다.
int[ ] ar
int ar[ ]
2. 배열 생성 (메모리에, 기본형은 이 단계 없다)
ar = new int[5]; 5개의 정수를 저장하는 배열이다.
1000번지라는 주소값을 100번지에 할당해준다.
1000이 실제값이 아닌, 주소정보이다. 참조형 변수이다.
stack heap 1번 진행 : 1000
: ar이 100번지에 생성된다. 아직 주소값이 없고, 여기에 값이 올 것이라는 것만 알고 있다. (1번 과정 끝)
: ar의 값이 미정이다 : null2번 진행
: 1000:[0]0][0][0][0]
: int 배열은 기본값이 0이다.3. 배열값 초기화 = 배열값 저장
4. 출력 총합 평균 최대 최소 ...
배열은 int, double, boolean, char, String, 배열 모두 가능하다.
int ar[ ] = new int[5];
문자열배열 ["servlet", "spring", "java"]
int 배열 초기화값 : 0
string 배열 초기화값 : ""
stach heap 100번지의 ar는 1000번지를 참조한다. 1000번지
["servlet"]["spring"]["java"]
사실 string도 참조변수라서 실제로는 아래와 같다.
[300] [400] [500]
300번지의 servlet
400번지의 spring
500번지의 java
1차원 배열 2차원 배열
1차원 배열
int i[]
{1, 2, 3}
2차원 배열
- int i [] [];
- i = new int[2][3]
- {{0,0,0}, {0,0,0}}
- i.length 하면 2가 나온다. 3개짜리 배열을 2개 가지고 있는 거라서.
- i[0] 는 3이다.
- i[1] 은 3이다.
- i[2] 는 오류이다.
- {{0,0}, {0,0,0}}
- int i[][] = new int[2][];
- i[0] = new int[2];
- i[1] = new int[3];
- 배열 두 개의 길이가 같다면 한번에 만들고, 아니라면 밑 코드처럼 new int[n]의 형태로 줘야 한다.
커맨드 라인을 통해 입력받기 ... ?
이건 main 메소드의 args를 사용하는 방법이다 !! 입력변수를 run configuration으로 받고, 실행하면 String 값으로 args 안에 들어가있다. 그 값을 사용하기 위해 for문을 사용하여 다른 배열에 담고 사용하는 것을 배운 것이다.
명령행 매개변수, String[] main
도스창 명령어 이클립스 A.java
javac A.java 자바가 실행된다.
java A ====> A의 main 메소드가 실행된다.컴파일 자동이다. A 클래스 실행시 입력변수를 전달받고 싶다.
A 클래스를 실행할 때 자바를 실행하는 그 라인에 변수를 전달하는데, 갯수는 공백으로 분류한다.
java A 홍길동 사원 인재개발부 ===> 3개의 입력변수 전달
java A 100 ===> 1개
java A 홍길동 29 ===> 2개run as - java application
run configuration - argument - program ar ... 이런 식으로 입력?전달받은 거 사용하는 법 class A {
public static void main(String[] args) {
}
}
String[] args는 String만 조작하는 args라는 배열이라는 뜻이다. args는 입력변수를 저장하는 용도이다. 배열을 사용하는 이유는 입력변수가 몇 개 올지 모르기 때문이다. String으로 모두 받은 뒤, 필요하다면 형변환해준다.와!!! (String[] args) 가 이런 뜻이었구나 !!!
이래서 main없으면 실행이 안 되는 거였구나 !!!
!!! 그렇네!!!
public void A(int a) { } 이거랑
public static void main(String[] args) { } 이거랑
똑같은 구조구나!!!!!!!!!!!!!!!!!!!!
몰랐네!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!java A 홍길동 사원 인재개발부
입력시 아래 문장이 자동으로 실행된다.
args = new String[3];
args[0] = "홍길동";
args[1] = "사원";
args[2] = "인재개발부";
java A ===> args.length = 0 ==> 입력변수 없다는 뜻이다.args라는 이름은 변경 가능하다. 굳이 할 필요는 없지만 ... run configuration 사용해서 입력변수 입력하기 - args[]에 값을 담기 위함이다.


공백으로 구분한 세 가지 문자열을 전달한다. 
이렇게 실행될 것 실행 결과 - args[]에 담긴 값을 for문으로 꺼내는 것이다.
public static void main(String[] args) { System.out.println("입력한 변수의 갯수 : " + args.length); System.out.println("입력한 내용은 다음과 같습니다."); for(int i = 0; i < args.length; i++) { System.out.println(args[i]); } } -------------------------------------------------------------- 입력한 변수의 갯수 : 3 입력한 내용은 다음과 같습니다. 홍길동 사원 인재개발부-
공백이 있는 값을 하나로 묶고 싶은 경우
- ㄱ ㄴ ㄷ 라고 하면, 공백이 값을 구분하는 역할이기에 {ㄱ, ㄴ, ㄷ}이 된다.
- "ㄱ ㄴ" ㄷ 라고 하면, {ㄱ ㄴ, ㄷ}가 된다.
- " "" 안에 묶자!!!"

코드 확인
- main메소드에는 String[] args라는 배열이 있다.
- String 타입이라서 정수 입력해도 String으로 반환된다.
- args는 props처럼 받은 값을 저장하기만 할 뿐, 값을 변경할 수 없다. 길이 변경도 불가하다.
- args의 길이를 1칸 늘리기 위해 userarray[]로 복사했다.
- run configuration을 통해 입력변수를 준다.
- userarray[]의 마지막에 값을 추가하고 싶다면, index 부분을 args.length로 주면 된다.
String userarray[] = new String[args.length + 1]; for(int i = 0; i < args.length; i++) { userarray[i] = args[i]; // 입력변수들 복사 System.out.println("userarray[" + i + "]: " + userarray[i]); } userarray[args.length] = "내가 추가한 문자열"; for(int i = 0; i < userarray.length; i++) { System.out.println("userarray[" + i + "]: " + userarray[i]); }args[ ]의 특정 키워드를 포함하는 값을 꺼내는 법 (StudentTest)
args[ ] = {"홍", "이", "김", "박", "최"} names[ ] = {"홍 응시자", "이 응시자", "김 응시자", "박 응시자", "최 응시자"} args[i].equals("홍") "홍" 문자열과 같은 걸 찾는다. names[i].equals("홍 응시자 ") "홍 응시자" 문자열과 같은 걸 찾는다. names[i].substring(0, 1).equals("홍") "홍 응시자" 의 0번째 문자열을 찾는다. names[i].trim().equals("홍 응시자") 만약 " 홍 응시자 " 인 경우, 양쪽의 빈칸을 모두 없애고 찾는다.
==와 equals()
- 참조형 변수 : 배열, String
- int a[] = new int[5]라고 하면 heap 영역에 새로운 공간을 만드는 것이다.
String s1 = "java";
String s2 = "java";
String s3 = new String("java");
String s4 = new String("java");
s2 = "jsp" 로 변경!
아 그런데. 여기서 new로 생성한 애들도 다시 사용할 수 있다.
String s5 = s3; 으로 한다면 s5와 s3은 ==도, .equals( )도 true가 나온다.
stack heap s4 : 400
s3 : 300
s2 : 100
s1 : 100100 : "java"
300 : "java"
400 : "java"stack은 먼저 생긴 게 밑으로 들어가니까 !! s2 : 500 500 : "jsp" == equals() 문자열 저장주소의 동등성을 비교한다.
String은 저장주소를 참조하기 때문 !!!문자열 내용의 동등성을 비교한다. s1 == s2 true
s3 == s4 falses1.equals(s2) true
s3.equals(s4) false엥 그런데 s2를 "jsp"로 변경한다면?
그러면 s1도 "jsp"로 바뀐 거라는 건데 ...
자바에서 문자열과 명령행 매개변수의 특성은 한번 메모리에 생성되는 순간, 길이도 내용도 변경할 수 없다. 불변이다.s1 == s2 false s1.equals(s2) false String의 메소드
이름 기능 반환 결과 equals() 문자열 내용을 비교한다. t / f length() 문자열 갯수를 나타낸다.
length는 배열 길이임!int charAt(index) 인덱스 번호에 해당하는 char를 반환한다. char subString(index, index) String s1 = "abcdefg";
s1.subString(1, 3) 1번 인덱스 ~ 3번 인덱스 전까지의 문자열 반환
b c 반환한다.String
오늘 수업 ... 너무 재밌었다 ... 나는 참조형 변수를 좋아하는 건가?
'스타터스 백엔드 3기' 카테고리의 다른 글
221209. 자바4 (객체지향 프로그래밍, 클래스, 메소드, 변수, static, 오버라이딩, 호출스택) (0) 2022.12.09 221208. 자바 3. 객체 (0) 2022.12.08 제이쿼리 $("#box-list").html() 내부의 let title = $("#title").val()이 선택되지 않는 건에 대하여 (0) 2022.12.07 221207 - 자바(개요, 변수, 연산자, 조건문과 반복문) (0) 2022.12.07 1205. react (0) 2022.12.05