JAVA 기초이지만 문법을 기억하고 응용하는 것이 어렵다. 아직 많이 헷갈리지만 꾸준히 복습해서 숙달하려고한다.어렵거나 중요한 패턴은 그냥 외우는 것도 좋을 것 같다. 화이팅👍
기본 자료형 -> 참조 자료형 => new 해당클래스명 -> 객체
스택 메모리 => 힙 메모리(new 사용 시 힙 메모리에 저장)
비트 연산자의 활용
- XOR과 AND를 조합해 덧셈, 뺄셈으로 활용
- 시프트 연산자를 활용해 곱셈, 나눗셈으로 활용
- 이런식으로 컴퓨터 연산에서 비트연산자가 활용된다는 것 정도만 숙지
⭐제어문
- 프로그래밍의 존재 이유와 목적을 꼽으라고 한다면 사용자의 input에 따라 달라지는 output을 자동화 하기 위함이라 할 수 있다.
- 이를 위해 필요한 것은 ~한 input인 경우, ~한 output을 만들어 내는 조건문
- 그것이 반복되는 연산과정을 자동화 하기 위한 반복문
- 조건문과 반복문을 포괄하는 명칭으로 프로그램의 순차적인 흐름을 제어하므로 이때 사용되는 명령문을 제어문이라함
- 제어문에 속하는 명령문들은 중괄호({})로 둘러싸여 있다.
⭐제어문 - 조건문
- if 문
- if / else 문
- if / else if / else 문
- Switch 문
⭐삼항연산자
- 문법
- 결과값 = 조건식 ? 반환값1 : 반환값2
- 물음표(?) 앞에 조건식에 따라 결과값이 참(true)이면 반환값1을 반환하고, 결과값이 거짓(false)이면 반환값2를 반환
- 자바에서는 간단한 if/else 문은 삼항 연산자를 이용하여 간결하게 표현
Switch문
- 기본 문법
- switch (input) {
case 값1:
조건 값이 값1일 때 실행하고자 하는 명령문;
break; //switch문을 빠져나가는 문구
case 값2:
조건 값이 값2일 때 실행하고자 하는 명령문;
break;
...
default:
조건 값이 어떠한 case 절에도 해당하지 않을 때 실행하고자 하는 명령문;
break;
}
- if / else if / else를 사용해도 동일하나, 가독성이 졸고 특정한 조건의 경우가 열거형으로 몇가지로 정해져 있을 때 주로 사용
- 단점 : 범위 지정이 불가하다.
- 그렇기 때문에 실제적인 값으로 비교 가능한 input에 사용한다.
⭐제어문 - 반복문(loop)
- while 문
- do / while 문
- for 문
- Enhanced for 문
⭐while 문
- while (조건식) {
조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
}
- while 문은 특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복
- while 문 내부에 조건을 false로 만드는 로직이 존재하지 않을 경우엔 프로그램이 무한 루프(infinite loop)
- 무한 loop가 default
do / while 문
- do / while 문은 일단 루프를 한 번 실행한 후에 조건식을 검사
- do{
조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
} while (조건식);
- do / while은 초기식 검증을 위해서 사용
⭐for 문
- for 문은 while 문과는 달리 자체적으로 초기식, 조건식, 증감식을 모두 포함
- 반복문이 종료가 될 수 있도록 기본설계가 되어 있다는 점에서 while문과의 차이
- for (초기식; 조건식; 증감식){
}
break, continue
⭐Enhanced for문
- 배열과 컬렉션에서 매우 많이 사용되는 문법으로서 index로 배열이나 리스트 등을 가져오는 것이 아닌, 배열의 값 그대로를 가져오는 방식
- 기본 문법
- for(타입 변수이름 : 배열이나 컬렉션이름){
배열의 길이만큼 반복적으로 실행하고자 하는 명령문
}
- Enhanced for 문은 명시한 배열이나 컬렉션의 길이만큼 반복되어 실행
- Enhanced for 문은 요소를 참조할 때만 사용하는 것
- 요소의 값을 변경하는 작업에는 불가
- 배열 요소는 배열 요소 그 자체가 아닌 배열 요소의 복사본이기 때문
기본형 데이터는 스택메모리에 그 값을 저장
참조형 데이터는 힙메모리에 그 값을 저장하고, 스택메모리에는 힙 메모리의 주소를 저장한다.
⭐Java의 메모리 구조
- 배열 출력시 toString()을 써야하는 이유
- call by reference, call by value
- 메소드 영역
- 빌드되어 만들어진 소스코드(클래스 등), 정적변수(static)등이 저장되어 코드 전역에서 사용 가능한 공간
- ⭐스택 영역
- 지역변수, 매개변수, 기본형 자료, 객체의 주소값 등을 저장
- 기본형 변수는 스택 영역에 저장
- ⭐힙 영역
- Heap 메모리는 애플리케이션 실행 동안 생성되는 모든 클래스 인스턴스와 배열을 저장하는 곳
- 참조형 변수인 객체 변수 등은 스택메모리에는 힙메모리의 주소만 저장해두고 실질적인 값은 힙 메모리에 저장
지역변수, 전역변수
- 자바 변수의 유효범위
- 자바에서의 if문 블록, for문 블록 등 안에서 선언된 변수는 블록 밖에서 참고할 수가 없고 해당 블록내에서만 유효
- 지역변수 : {}로 구분되는 영역에서만 유효한 변수
- 현재 단계에서는 {}열고, 닫는 영역까지만 변수의 범위가 유효하다는 것 숙지
- 전역변수 : 클래스 전역에 접근할 수 있는 변수
⭐다중 반복문
- 반복문 안에 반복문
public class C03Operator {
public static void main(String[] args) {
// 0000101 0000110
int n3 = 5; int n4 = 6;
// 비트연산자 : &, 각자리의수가 모두 1일경우에만 1
System.out.println(n3 & n4); //4 => 0000100
// 비트연산자 : |, 각자리의수가 하나라도 1일경우는 1
System.out.println(n3 | n4); //7 => 0000111
// 비트연산자 : ^, 각자리의수가 일치하지 않은 경우에
System.out.println(n3 ^ n4); //3 => 0000011
// ~ : not연산, 각자리마다 반대의 숫자 반환
System.out.println(~ n3); //첫째자리가 음/양인데, 음으로 변환
// 시프트연산자 : <<, >> = 곱셈과 나눗셈의 효과가 발생
System.out.println(n3 << 1); //0001010 2의 1승만큼 곱셈
System.out.println(n3 << 2); //0010100 2의 2승만큼 곱셈
int a = 13; //00001101
int b = 9; //00001001
while(b!=0) { // b가 0일때 while문 종료
int same_index = a & b; //and연산으로 구한 carry 생성
a = a ^ b; //XOR 연산으로 구한 비트값 a에 할당
b = same_index << 1;
}
// 첫번째 반복
// sameindex : 1001
// a : 00100
// b : 10010
// 두번째 반복
// sameindex : 00000
// a : 10110 => 22
System.out.println(a);
}
}
import java.lang.invoke.SwitchPoint;
import java.util.Scanner;
import java.util.SplittableRandom;
public class C04IfStatements {
public static void main(String[] args) {
// 비밀번호 => 1234
// 스캐너를 써서 사용자의 input int로 받아서 만약에 비밀번호와 사용자의 input 일치하면 문이열렸습니다.
// 일치하지 않으면 비밀번호가 틀렸습니다 출력
// 도어락키 if문 예제
// 0234 -> 00234 = int로 받으면 비밀번호가 맞아버리기 때문에 String으로 받아야 한다.
String pw = "0234"; //String의 기능을 pw가 가지고 있는 의미(복사본의 의미)
System.out.println("비밀번호를 입력해주세요.");
Scanner Scan1 = new Scanner(System.in);
String input1 = Scan1.nextLine();
if (pw.equals(input)){ //문자열 비교시 == 사용금지, .equals 사용.
System.out.println("문이열렸습니다.");
} else {
System.out.println("비밀번호가 틀렸습니다.");
}
// 묵시적 타입변환, 각 문자가 숫자를 가지고 있다.
// a : 97, A : 65
// 사용자한테 알파벳을 아무거나 입력받고, 그 알파벳이 대문자인지 소문자인지 판별
Scanner Scan2 = new Scanner(System.in);
System.out.println("알파벳을 입력해주세요");
char input2 = Scan2.nextLine().charAt(0);
if (input >= 'a' && input <= 'z') {
System.out.println("소문자입니다.");
}else if (input > 'A' && input < 'Z') {
System.out.println("대문자입니다.");
}else {
System.out.println("알파벳이 아닙니다.");
}
// 버스카드 예제
// 내 돈이 얼마있는지를 입력
// 버스요금이 1500이다.
// 돈이 더 적으면 탑승불가, 돈이 더 많으면 정상처리 출력.
// 도난여부 boolean 설정(입력X)
int myMoney = 10000;
boolean isStolen = false;
System.out.println("도난카드입니까? 예/아니오로 대답하시오");
Scanner sc = new Scanner(System.in);
if(sc.nextLine().equals("예")){
isStolen = true;
}
if (myMoney < 1500 || isStolen == true) {
System.out.println("탑승불가입니다.");
} else {
System.out.println("정상 탑승되었습니다.");
}
if (myMoney >= 1500 && isStolen == false) {
System.out.println("정상 탑승되었습니다.");
} else {
System.out.println("탑승불가입니다.");
}
// 삼항연산자
// 도어락키 if문 예제
String pw = "0234";
System.out.println("비밀번호를 입력해주세요.");
Scanner Scan1 = new Scanner(System.in);
String input1 = Scan1.nextLine();
String result = pw.equals(input1) ? "문이 열렸습니다." : "비밀번호가 틀렸습니다."; //결과값 = 조건식 ? 반환값1 : 반환값2
System.out.println(result);
if (pw.equals(input1)){ //문자열 비교시 == 사용금지, .equals 사용.
System.out.println("문이열렸습니다.");
} else {
System.out.println("비밀번호가 틀렸습니다.");
}
// myMoney = 10000
// 택시요금 : 10000원
// 버스요금 : 3000원
// 킥보드 : 2000원
// 걸어가기 : 0원
int myMoney = 10000;
int texyFee = 10000;
int busFee = 3000;
int KickBoardFee = 2000;
if(myMoney >= texyFee) { // if, else if는 서로 의존적
System.out.println("택시타시는걸 추천드립니다.");
}else if(myMoney >= busFee) {
System.out.println("버스타시는걸 추천드립니다.");
}else if(myMoney >= KickBoardFee) {
System.out.println("킥보드타시는걸 추천드립니다.");
}else {
System.out.println("걸어가세요.");
}
if(myMoney >= texyFee) { // if는 독립적이어서 범위를 정확히 명시해주어야 한다.
System.out.println("택시타시는걸 추천드립니다.");
}if(myMoney < texyFee && myMoney >= busFee) {
System.out.println("버스타시는걸 추천드립니다.");
}if(myMoney < busFee && myMoney >= KickBoardFee) {
System.out.println("킥보드타시는걸 추천드립니다.");
}if(myMoney < KickBoardFee) {
System.out.println("걸어가세요.");
}
// Switch 고객센터 출력 예제
// 원하시는 번호를 입력해주세요
// 1. 대출서비스입니다., 2. 예금, 3. 적금
// 0.상담사 연결입니다., 그외 : 잘못누르셨습니다.
System.out.println("원하시는 번호를 입력해주세요");
Scanner Scan4 = new Scanner(System.in);
int input4 = Scan4.nextInt();
switch (input4) {
case 1:
System.out.println("대출서비스 입니다.");
break;
case 2:
System.out.println("예금서비스");
break;
case 3:
System.out.println("적금서비스");
break;
case 0:
System.out.println("상담사 연결입니다.");
break;
default:
System.out.println("잘못누르셨습니다.");
break;
}
}
}
import java.util.Arrays;
import java.util.Scanner;
public class C05LoopStatements {
public static void main(String[] args) {
// while문 사용해서 2~10까지 출력
int n = 2;
while(n < 11) {
System.out.println(n);
n ++;
}
while(true) { // while문으로 감싸면 무한으로 구구단 출력 가능
Scanner sc = new Scanner(System.in);
System.out.println("구구단 단수를 입력해주세요");
int input = sc.nextInt();
int n = 1;
while (n < 10) {
System.out.println(input + " X " + n + " = " + input * n);
n++;
}
}
// System.out.println(input + " X " + 1 + " = " + input*1);
// System.out.println(input + " X " + 2 + " = " + input*2);
// System.out.println(input + " X " + 3 + " = " + input*3);
// System.out.println(input + " X " + 4 + " = " + input*4);
// System.out.println(input + " X " + 5 + " = " + input*5);
// System.out.println(input + " X " + 6 + " = " + input*6);
// System.out.println(input + " X " + 7 + " = " + input*7);
// System.out.println(input + " X " + 8 + " = " + input*8);
// System.out.println(input + " X " + 9 + " = " + input*9);
// 도어락키 if문 예제 : 비밀번호를 맞추면 반복이 종료되고, 그렇지 않으면 계속적으로 다시 질문
// 최대 5번까지만 비밀번호 입력가능하도록 => 입력횟수를 초과했습니다 라는 문구
int a = 0;
while(true) {
String pw = "0234";
System.out.println("비밀번호를 입력해주세요.");
Scanner Scan1 = new Scanner(System.in);
String input1 = Scan1.nextLine();
if (pw.equals(input1)) {
System.out.println("문이 열렸습니다.");
break;
} else{
System.out.println("비밀번호가 틀렸습니다.");
}
a++;
if(a==5) {
System.out.println("입력횟수를 초과했습니다.");
break;
}
}
// do while문 사용해서 2~10까지 출력
int n = 2;
do {
n ++;
System.out.println(n);
} while(n < 11);
// for문을 통해 2~10까지 출력
for(int a = 2; a < 11; a++){
System.out.println(a);
}
// for, continue를 사용해서 홀수만 출력되도록(1~10까지 수 중에)
for(int a = 1; a < 11; a++){
if(a%2 == 0){
continue; //continue를 만나면 위로 올라가서 if문 다시실행
}
System.out.println(a);
}
// 배열과 enhance for문
int[] myArr = {1,5,7,9,10};
// 일반 for문
for(int i=0; i<5; i++){
System.out.println(myArr[i]);
}
// enhance for문
for(int a : myArr){
System.out.println(a);
}
// 일반for문을 통해 myArr의 값에 10씩 더한 뒤에 출력.
for(int i = 0; i< myArr.length; i++){
myArr[i] += 10;
}
System.out.println(Arrays.toString(myArr));
// enhanced for문을 통해 myArr의 값에 10씩 더한 뒤에 출력.
// enhanced for문으로는 값 변경이 불가능 하다. 출력 시 값에 10씩 더해지지 않음.
// 배열의 조회 및 합계에 자주 사용
for(int a : myArr){
a += 10;
}
System.out.println(Arrays.toString(myArr));
// 배열의 합계에 사용시 간단하게 사용가능
int sum = 0;
for(int a : myArr){
sum += a;
}
System.out.println(sum);
// 자바 변수의 유효범위 : { }
int num = 10;
if(num > 1){
int abc = 20;
num = 20;
}
System.out.println(num); // if문 밖에서 선언된 변수값을 if안에서 접근하여 변경하는 것은 가능.
System.out.println(abc); // if문 안에서 정의된 변수는 밖에서 인지 불가
for(int n = 2; n < 10; n++){
System.out.println(n + "단입니다.");
for(int i = 1; i < 10; i++){
System.out.println(n + " X " + i + " = " + n*i);
}
}
// 2중 for문을 통해 배열접근
int[][] arr = {{1,2,3,4}, {5,6,7,8}};
for(int i = 0; i< arr.length; i++){
for(int a = 0; a< arr[i].length; a++){
System.out.println(arr[i][a]);
}
}
}
}
import java.util.Scanner;
public class C05LoopPractice {
public static void main(String[] args) {
// 짝수의 합 계산하기
// 1~20까지 짝수의 합 출력
int result =0;
for(int a = 1; a <=20; a ++){
if(a%2 == 0){
result += a;
}
}
System.out.println(result);
// 숫자 뒤집기
int num = 1234;
int result = 0;
while(true){
int temp = num % 10;
result = result*10 + temp;
num /= 10;
if(num==0){
break;
}
}
System.out.println(result);
// 최대공약수 구하기
int a = 24; int b = 36;
int num = a > b ? b : a;
int maxNum = 0;
for(int i=1; i<=num; i++){
if(a % i == 0 && b % i == 0){
maxNum = i;
}
}
System.out.println(maxNum);
int minNum = a/maxNum * b/maxNum * maxNum;
System.out.println(minNum);
}
}
'JAVA STUDY > JAVA Practice' 카테고리의 다른 글
[JAVA Intellij] Build Tools 세팅 (0) | 2024.01.25 |
---|---|
[JAVA] 재귀함수 및 순열 예시 (0) | 2024.01.04 |
[JAVA Intellij] Jackson Intellij 적용 (0) | 2023.12.27 |
[JAVA] String split메서드 및 Set자료형 활용(with.Stream) (0) | 2023.12.22 |
[JAVA] 기초 문법 Practice1 (1) | 2023.12.05 |