728x90

 

배열 → 기억공간 여러개를 만들어서 사용
클래스 → 기억공간 여러개를 하나의 구조로 만들어서 사용 (바구니)
배열과 클래스는 모두 데이터를 담는 역할은 같지만 만들어지는 구조는 서로 다릅니다. Object(객체)로 여겨지기 때문에 기억공간 여러개가 붙어있는 상태라면 두가지를 구분하기 힘들지만, 큰 차이는 메모리 공간에 저장되는 데이터가 동일한 데이터타입이라면 배열, 이질적인 데이터타입들이 담아 구조를 직접 설계하여 내가 원하는 형태로 만들어야하는 경우 클래스로 만들게 됩니다.


💡 객체배열(Object Array)의 메모리 표현

객체 배열은 배열의 각 요소가 객체인 배열을 말합니다.
즉, 객체 배열은 동일한 클래스의 객체를 여러 개 저장하기 위해 사용됩니다.

Student[] = new Student[3];

// Student 클래스
public class Student {
    private String name;
    private int age;

// ↓ 위에서 만들어진 생성자 메서드 오버로딩
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter와 Setter 메서드 생략

    // 기타 메서드 및 속성 정의
}

// main 메서드내부에서의 객체 배열 사용 예시
public class Main {
    public static void main(String[] args) {
        // Student 객체 배열 생성
        Student[] students = new Student[3];

        // Student 객체 생성하여 배열에 저장
        students[0] = new Student("피카츄", 20);
        students[1] = new Student("파이리", 22);
        students[2] = new Student("꼬부기", 21);

        // 객체 배열 순회하며 정보 출력
        for (int i = 0; i < students.length; i++) {
            System.out.println("Name: " + students[i].getName());
            System.out.println("Age: " + students[i].getAge());
            System.out.println();
        }
    }
}

//출력 -> 
Name: 피카츄
Age: 20

Name: 파이리
Age: 22

Name: 꼬부기
Age: 21

 

위의 예시에서는 "Student" 클래스의 객체 배열을 생성하고, 각 요소에 학생 객체를 생성하여 저장하였습니다.
그 후, 배열을 순회하며 각 학생의 정보를 출력하였습니다. 객체 배열은 여러 객체를 관리하고 접근하기 위한 유용한 자료구조입니다.

💡 system.arraycopy - 배열의 요소를 다른 배열로 복사하는 메서드

** System.arraycopy는 Java에서 배열의 요소를 다른 배열로 복사하는 메서드입니다. 이 메서드를 사용하여 배열 요소의 복사, 이동, 잘라내기 등 다양한 작업을 수행할 수 있습니다.

문법 : System.arraycopy(srcArray, srcPos, destArray, destPos, length);

  • srcArray: 복사할 원본 배열입니다.
  • srcPos: 원본 배열에서 복사를 시작할 인덱스(숫자를 입력)입니다.
  • destArray: 복사한 요소를 저장할 대상 배열입니다.
  • destPos: 대상 배열에서 복사한 요소를 저장할 시작 인덱스(숫자를 입력)입니다.
  • length: 복사할 요소의 개수(길이)입니다.

**srcArray의 srcPos 인덱스부터 시작하여 length 개수만큼의 요소를 **destArray**의 destPos 인덱스부터 시작하는 위치에 복사합니다.

예시 코드

int[] startArray = {1, 2, 3, 4, 5};
int[] copyArray = new int[3];

System.arraycopy(startArray, 1, copyArray, 0, 3);

// 복사된 요소 출력
for (int i = 0; i < copyArray.length; i++) {
    System.out.println(copyArray[i]);
}
// 출력 : 2,3,4

 

위의 예시에서는 startArray의 인덱스 1부터 시작하여 3개의 요소를 copyArray의 인덱스 0부터 시작하는 위치로 복사하였습니다. 결과적으로 copyArray에는 {2, 3, 4}가 저장되어 출력됩니다.

728x90
반응형
728x90
반복문(loop) for , foreach

 

  • 일반적으로 반복하는 횟수가 정해진 경우에 (예측 가능) 사용하고 문법은 초기식, 조건식, 증감식으로 구성되어 있고 세미콜론으로 구문지어진다.
  • 초기식은 맨 처음 한번만 수행되며 이후, 조건식 → 반복문장 → 증감식이 반복적으로 수행된다.

 

for loop의 실행과정

 

http://www.tcpschool.com/php/php_control_loop

 

foreach문의 실행과정 (향상된 for문)

 

http://www.tcpschool.com/php/php_control_loop

 

numArray에서 데이터를 하나씩 전부 꺼내오면서 출력해준다.

//Q. 배열에 있는 원소를 출력해보자
        int [] numbers = {1,2,3,4,5,6,7,8,9,10};

        for (int i=0; i< numbers.length; i++) {
            System.out.println(numbers[i]);
        }

//출력물 -> 1,2,3,4,5,6,7,8,9,10

for(int num : numbers) {
            System.out.println(num);
        }

//출력물 -> 1,2,3,4,5,6,7,8,9,10

 

배열로 만들어진 데이터들은 각각의 기억공간에 저장되어 있으며, 인덱스 번호가 0부터 주어지게 된다.
배열이름[인덱스번호] -> 위의 문법으로 기억공간의 데이터에 접근할 수 있게된다.
해당배열의 길이만큼 반복되어야 해당 데이터가 순서대로 출력될 수 있어 길이는 배열이름.length로 설정할 수 있다.

  • for(int num : numbers) { System.out.println(num);}
    → foreach문법으로 for문안의 괄호에 배열내에 있는 데이터들을 담을 수 있는 변수를 설정한 후 해당 변수를 출력하면 배열 내의 데이터들이 전부 출력된다.

 

While(반복문) - 먼저 조건식 검사를 반복할 문장을 실행한다.

몇번이 반복될 지 예측이 어려울 때 보통 while문을 사용한다.

 

while문은 먼저 조건식을 확인하게 되는데 , 처음부터 조건식이 거짓인 상황이면 내부 코드를 하나도 실행하지 않 바로 수식을 빠져나가는 상황이 발생할 수 도 있다.

 

제어문 break, countinue
반복문의 실행 상태를 제어하고자 break문과 continue 문을 사용한다.

 

  • break문 - 현재 사용중인 반복문을 중단하고 제어를 반복문 바깥으로 이동한다. / 반복문이 동작 중 break를 만나게 되면 break가 속해있는 반복문을 바로 빠져나가게 된다.
  • continume문 - 현재 수행중인 반복문에서 현재 조건 값에 대한 처리를 중단하고 다음 조건 값에 대한 처리를 실행 / 반복문 실행 중 continue를 만나면 continue 아래의 문장을 실행하는 것이 아니라 반복문의 시작으로 돌아가도록 한다.

 

public class Ex_5_breAk_conTinue {
    public static void main(String[] args) {
        char[] c = {'s','h','u','t','d','o','w','n'};

        for(int i=0; i<c.length; i++) {
            if(c[i] == 'o')
                break;
            System.out.println(c[i]);
        }
        int count = 0;
        for (int i=1; i<=10; i++) {
            if(i%3 !=0 ) continue;
                count++;
        }
        System.out.println("count = " + count);
    }
}

//s,h,u,t,d 까지의 문자가 출력된다.
728x90
반응형
728x90

 

 

조건문 → IF문

 

 

순서도로 한번 알아보자 (=flowchart)

 

순서도에서 마름모 모양은 판단조건이며 true or false에 따라 동작하는 구문이 달라진다.
조건식으로 올 수 있는것은 참 or 거짓으로 밖에 오지 못하기 때문에 관계연산자와 논리연산자를 사용하여 조건식을 작성 할 수 있다.
{ }를 이용하여 시작과 끝을 설정할 수 있고, 참일 때 블록안의 문장들이 실행되고, 실행이 완료되면 if 문을 빠져나가게 된다.
만약 조건식이 참일 때, 하나의 문장만 실행되는 경우에는 { } 를 작성하지 않아도 된다.

 

 

if문을 사용하여 프로그래밍 시 다양한 환경에 대해 조건에 따라 다른 동작을 할 수있게 만든다.

  1. 단순 if 문 → 조건식이 참이면 중괄호로 둘러 쌓인 블록안의 문장들이 실행된다.
  2. 블럭 if 문 → if의 조건식이 참이면 조건식 바로 다음의 블록이 실행되고, 조건시기 거짓이면 else 문 다음 블록이 실행된다.
  3. 다중 if 문 → if 문 안의 문장이 또 다른 if 문인 경우 (if-else문 포함)

 

Switch - case 문
 주로 다중 선택에 사용되며, 다중 if문 보다 간결하지만 사용영역이 if-else에 비해 제한적이다.

 

switch문의 문법은 switch문은 하나 이상의 case문으로 구성되고, 대개 default문도 있지만 이는 필수적인 요소는 아니다.

switch-case의 순서도를 살펴보자 표현식에서 시작되어 각각의 case를 읽어가며 코드 블럭을 실행하고, 해당 case들과 일치하는 문장이 없다면 가장 하단의 default 문장을 실행하며 switch문이 종료된다.

 

 

switch() 괄호 안에 조건식을 입력하여 (수식) { } 시작과 끝을 설정해준다. 해당 중괄호 안에는 case를 나열하여 조건별로 실행될 문장들을 작성하면 된다.
break; 는 case 하나 당 작성해두는 것이 좋다. break는 각각의 case의 값들과 일치하게되면 해당 case의 문장을 실행하고 해당 수식을 벗어나는 역할을 가지고 있다.
만약, break가 없다면 값과 일치하는 case문을 실행하고 해당 문장을 벗어나는 것이 아니라 다음 case들로 이동하여 실행되기 때문에 작성해주어야 제어가 가능하다.
default는 각각의 case문들이 조건식의 값과 일치하는 게 없을 때, default 문이 실행되며 해당 코들르 빠져나가게 된다.

case의 값은 다른데 만약 같은 코드를 실행하고 싶다면 case 값1 : case 값2 : 이와 같이 작성하면 된다.

 

 

 

import java.util.Scanner;

public class Ex_1_Switich {
    public static void main(String[] args) {

        System.out.println("요일을 입력하세요 = ");

        Scanner scan = new Scanner(System.in);
        String day = scan.next();


        switch(day) {
            case "월요일":
                System.out.println("농구하기");
                break;

            case "화요일" :
            case "수요일" :
                System.out.println("수영하기");
                break;

            case "금요일":
                case "토요일":
                System.out.println("휴식");
                break;
            case "일요일":
                System.out.println("야구하기");
                break;
            default:
                System.out.println("요일을 잘못 입력하셨습니다.");
        }
    }
}

-> 요일을 입력하세요 = 월요일
	 농구하기
728x90
반응형
728x90

 

 

Java의 연산자들 (단항, 이항, 삼항 , 증감, 산술, 관계, 논리, 복합대입)

키보드로부터 데이터를 입력 받는 방법 Scanner scan = new Scanner(System.in); → java.util.Scanner (import 필요 / API)

Scanner API를 사용해서 사용자에게 값을 입력받아 코드를 작성할 수 있는 작성 순서
1. import java.util.Scanner;를 최상단에 작성하여 Scanner API를 임포트 가능하도록 작성
2. Scanner scan = new Scanner(System.in); 을 작성하여 scan 객체를 생성한다.
→ 여기서 객체변수 이름인 scan은 다르게 작성하여도 된다.
3. scan.nextInt(); 을 작성하여 사용자에게 입력받을 값을 어디에 저장할 지 데이터 타입과 변수를 통해 선언해준다.

 

연산자

 

+, - , % , x 등과 같이 연산에 사용되는 기호를 말한다. java에는 다양한 연산자가 있기 때무에 표로 간단하게 보고 넘어가도 괜찮다.

 

연산자끼리도 연산식 내에서 여러개의 연산자가 사용되었을 때 우선순위가 존재한다. 위의 그래프의 순서대로 우선순위가 정해지며, 단항연산자가 가장 높고 대입(=할당) 연산자가 가장 낮은 우선순위를 가지고 있다.

 

 

 

 

삼항연산식 (조건식) ? A : B

 

삼항 연산자는 3개의 항을 이용하여 조건식을 만들 수 있는 연산자이다. 조건식에는 참(true) or 거짓(false)이 올 수 있으며,
만약 조건식의 결과가 참인경우 식1의 결과를 리턴하고, 거짓인 경우 식 2의 결과를 리턴해준다.

 

 

ex) int a = 9; a < 10 ? “a는 10보다 작다“ : “a는 10보다 크다” (a의 값이 10보다 작으므로, “a는 10보다 작다”라는 문장이 출력된다.

  • 복합 대입(=) 연산자 - 대입연산자(=) : 연산자 오른쪽 수식의 값을 왼쪽 변수에 대입
  • 관계비교 연산자 : 왼쪽과 오른쪽의 대소 관계를 비교하는 연산자 연산의 결과는 참(true) 아니면 거짓(false)으로 두가지 형태의 결과값을 가진다. ** instanceof → 숫자를 비교하는 것이 아닌 부모 클래스와 자식 클래스가 상속관계인지 확인할 수 있는 연산자이다.
  • 논리연산자 : 연산의 결과는 위의 관계비교 연산자와 같이 참 아니면 거짓의 값이 리턴된다.

 

728x90
반응형
728x90
배열(Array) 이란?
같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 ‘배열(array)’이라고 한다.


동일한 데이터를 연속적으로 만드는 방법이 배열이며, 배열을 사용하면 많은 양의 데이터를 손 쉽게 다룰 수 있고, 배열 안에 같이 담기는 데이터들은 같은 타입이어야 한다. 배열도 Object와 마찬가지로 여러개의 기억공간으로 이루어져있는 구조이기 때문에, 배열도 객체로 여겨진다.

저장할 데이터의 수가 많아지면, 개별로 변수가 만들어지는 것 자체가 비 효율적이고, 데이터 처리가 복잡해진다.
→ 배열로 만들어진 데이터는 데이터들끼리 인접해있기때문에, index(색인)을 지정해줄 수 있어, 반복문을 통해 데이터 처리가 용이해진다.

배열의 메모리주소

배열은 배열의 첫번째 항목인 배열[0]의 시작 주소가 배열 전체의 시작 주소와 동일하다.
배열의 몇번째 항목을 출력할 지 정하지 않고 그냥 배열의 이름만 넣어서 출력하면 메모리 주소를 확인할 수 있는데,
이것이 배열이 가리키는 첫번째 항목의 주소이다.

배열만 출력하였을 때 , 내부 데이터로 접근하지 않아서 위와 같은 메모리 주소가 출력된다.

 

만약 int a[] = {10,20,30}과 int b[] = {10,20,30}으로 같은 내용의 값을 가지고 있지만 저장되는 메모리 주소는 다르다. 즉, 내용물이 같다고 해서 같은 배열이라고 볼 수 없다는 것이다. a[0]과 b[0]은 이름만 다를 뿐 아니라 해당 배열이 가지고 있는 내용물이 저장된 장소도 다르다고 보면 된다.

 

 

연속적인 기억공간 하나의 이름을 위의 변수가 a라는 변수라면 전체의 이름은 a이고, a에서 a[0], a[1], a[2] 인덱스 넘버를 이용해서 변수이름[인덱스번호]로 설정하여 해당 배열 내의 데이터로 접근가능하다.
그래서 배열은 반복문을 활용하여 코드를 작성할 때 , 용이하게 쓰인다.
개별로 작성되어 있다면, 인접되어 있지 않아 사이에 다른 메모리가 있기 때문에 기억공간 하나하나에 접근하기 어렵다.

1차원 배열은 선형구조 or 리스트형 구조라고 말하며, 2차원 배열은 행과 열로 이루어진 배열이다.
  • 2차원 배열
행 ↓ / 열 →    
     
     

행과 열로 이루어져 있고 , 만약 array[2],[3] 이렇게 작성되어있다면 위 상단의 표처럼 그려져 있는 표라고 생각하면된다. 1차원 보다는 2차원이 더 많은 기억공간을 사용할 수 있다. 객체 자료형으로 만들어진 클래스도 기억공간이 붙어 있어 배열과 같은 형태로 보일 수 있지만, 클래스는 기억공간 안에 들어가는 데이터들이 각각 다른 데이터 타입들로 담아질 수 있다는 게 배열과 큰 차이점이 있다. 배열은 동일한 데이터 타입만 여러개 담을 수 있는 자료형이다.

배열의 문법 int[] → int 가 여러개 있는 구조라는 이름으로 배열을 설정할 수 있다.

 

배열자료형 → 정수 5개를 저장할 배열을 생성하시오. int[] a = new int[5]; 생성과 동시에 값을 저장하는 것을 초기화라 하며, 배열이 초기화 된 상황이다. 기본값은 int로 설정되었고, 값이 입력이 되어 있지 않더라도 배열은 생성을 하면 기억공간 안안에 int의 기본값인 0으로 초기화가 되어있다.

배열의 인덱스는 0번부터 시작이 되며 , 변수가 대표이름이 되고 인덱스(색인)번호에 따라 기억공간을 가르킬 수 있고, 배열의 변수 이름은 배열이 생성된 변수이름[index번호] 위와 같이 정해진다. 또 해당 배열의 데이터가 이동이 될 때, 번지를 가리키고 있는 a가 이동이 되기 때문에 a를 이동하게되면 언제든 a가 참조하고 있는 배열의 데이터들을 사용할 수 있기 때문에, 이동이 쉬워진다.

public class ArrayMake {
    public static void main(String[] args) {
        //Q.정수 5개를 저장 할 [배열]을 생성하시오.
        int[] a = new int[5];
        /*
        5개의 연속적 메모리공간을 만든 후 정수 5개가 들어가야하기때문에 타입은 전부 int이다.
        구조의 이름읜 int[]이고, 1차원 배열이되고 배열도 하나의 Object라고 여겨진다.
        */

        for(int i=0; i < a.length; i++) {
            a[i] += 10+i;
            System.out.println(a[i]);
        }
    // 배열은 반복문을 사용하여 데이터를 출력하면 효율적으로 출력이 가능하다.
    }
}

//출력 -> 10,11,12,13,14

 

 

 

 

 

 

배열의 초기화 (실습)

int[] a = {10, 20, 30, 40, 50}과 같이 작성하여 기본 값이 아닌 다른 값으로 초기화 할 수 있다.
이 때, 이렇게 작성하게 되면 new 연산자를 사용하지 않고도 초기화 하는 것이 가능해진다.
해당 리스트는 초기화 리스트라고 불리고, { }안에 적힌 갯수만큼 배열이 만들어진다.
new int[5]; 로 작성하지 않더라도 배열을 생성할 수 있는 문법이다!

int[] a; a = {10, 20, 30, 40, 50} 이와같이 두 줄로 작성하게 되면 초기화 되지 않는다 초기화 리스트는 변수와 한줄로 작성이 되어야지 에러가 나지 않고 올바르게 초기화 된다.
두 줄로 나뉘어 졌을때의 초기화 방법은 int[] a; / a=new int[]{10,20,30,40,50} 이렇게 작성해주어야 한다.

728x90
반응형
728x90
Binary Text 실습

 

//Q. 69를 10진수, 2진수, 8진수 , 16진수로 출력해보자

        int decimal = 69;
        System.out.println("decimal = " + decimal);
        
        int binary = 0b01000101; //2진수에는 0b를 붙여준다.
        System.out.println("binary = " + binary);
        
        int octal = 0105; //8진수에는 0을 붙여준다
        System.out.println("octal = " + octal);
        
        int hexa = 0x45; //16진수에는 0x를 붙여준다.
        System.out.println("hexa = " + hexa);


API의 도움을 받아서 숫자를 변환해볼 수 있다.

toBinaryString(data) → 해당 메서드를 사용하면 int 값을 2진수로 변경해준다. 이후 변경된 값을 String binary에 담아 출력해보았다. toOctalString → 8진수로 변환해주는 메서드 toHexString → 16진수로 변환해주는 메서드

charTest / 아스키 코드에 대해서 이해해보자
아스키 코드에서 몇가지 숫자만 외워두고 앞뒤로 더해서 기억하면 된다

‘0’ = 48 / ‘a’ = 97 / ‘A’ = 65

 

public static void main(String[] args) {

        //Q. '가'라는 한글 한 문자를 변수에 저장하고 출력하시오.
        char a = 'A';
        System.out.println("a = " + a);
        int a1 = 'A';
        System.out.println("a1 = " + a1);
        System.out.println("a1 = " + (char)a1);
        //char 자료형은 2byte로써 4byte인 int 자료형에는 담길 수 있다.
        //단 아스키코드표에 있는 숫자형으로 변경되어 저장된다.
        //char 자료형을 문자 그대로 출력하고 싶을 땐 변수 앞에 (char)를 기입하여 형변환을 진행해준다.
        
        //Q. 대문자 'A'를 문자 'a'로 변환하여 출력하시오 (아스키코드참고)
        char upper = 'A';
        char change = (char) (upper + 32); //'a'
        //알파벳 대문자 아스키코드의 숫자와 소문자에 해당하는 숫자의 차이가 32이기 때문에,
        //대문자 아스키코드 숫자에서 +32를 하면 소문자가 / 소문자의 숫자에 -32를 하면 대문자로 바꿀 수 있다.
        System.out.println("upper = " + upper);
        System.out.println("change = " + change);

       //Q. '1' + '2' = 3이 나오도록 프로그래밍 해보자
        int z = '1'; //49
        int x = '2'; //50
        int sum = (z-48)  + (x-48);
        System.out.println("sum = " + sum);
    }

 

형 변환 (Casting) - 값의 타입(DataType)을 다른 타입으로 변환하는 것
(변환할 DataType)변수; → 해당 문법과 같이 작성한다.

 

자동 형변환 (묵시적) : 작은 type이 큰 type에 저장되는 경우 (예 : byte → int) 강제 형변환 (명시적) : 큰 type이 작은 type에 저장되는 경우(예 : int → byte, 손실발생) / 타입을 강제로 맞춰야하는 것이 강제 형변환 ** boolean type은 형변환이 안된다.

ex) int(4byte) → char(2byte) 형변환 = (char)65 → ‘A’

ex) float(4byte) → int(4byte) 형변환 = (int)2.6f → ‘A’ 여기서 float는 2.6 소수점이 있지만 int는정수형으로서 소수점 아래는 잘려서 출력된다. 이 때, 2(손실)의 값 손실이 발생하게 된다.

 

public class CatstingTest {
    
    public static void main(String[] args) {
        
        float f1 =.10f;  // 0.10
        System.out.println("f1 = " + f1);
        
        float f2 = 15f; // 15.0
        System.out.println("f2 = " + f2);
        
        float f3 = 3.14f;
        System.out.println("f3 = " + f3);

        double d1 = 123.4567;
        System.out.println("d1 = " + d1);

        float x = 15.6f;
        int y = (int)x;
        
        실수형 데이터가 정수형 데이터에 저장하려면 (int)로 강제형변환을 진행해야 함
        강제 형변환 시 값 손실이 발생한다.
        
        System.out.println("y = " + y);

        char c = 'A';
        int cc = c;
        System.out.println("cc = " + cc);
        
        c는 2byte, cc는 4byte로 수치형 자료로 서로 호환이 가능하기 때문에,
        자동형변환이 가능하며, 값 손실이 발생하지 않는다.
        
    
    }
}

 

728x90
반응형

+ Recent posts