[JAVA_Back-End]

[JAVA] 배열, 객체지향 프로그래밍 본문

Programming/JAVA

[JAVA] 배열, 객체지향 프로그래밍

너굴위 2023. 8. 22. 16:02
728x90
반응형

< 지난 포스팅 정리 >

 

자료

- 자료형

  기본자료형: boolean, char, byte, short, int, long, float, double

  참조자료형: 배열(array)

- 변수/상수

   변수선언    => 자료형 변수명;

   상수선언    => final 자료형 변수명;

   이름선언

           1. 식별자 규칙     -에러

           2. 표기법 

                    변수: 소문자로 시작

                    상수: 대문자로 구성, _표기

- 형변환

  자동(묵시적)형변환

  강제형변환

- 연산자

  산술연산자

  증감연산자

  대입연산자

  복합대입연산자

  비교연산자

  논리연산자

  ---------------

  비트연산자(이진수 연산 -IoT/ Graphic)

 

제어

조건에 의한 분기

if~else~

if~ else if~ else~

switch~case~default~

 

조건에 의한 반복

for

while

do~while

break,continue

 


[Array]

선언과 생성

선언- 변수명 

          자료형[] 변수명;

          자료형 변수명[];

 

생성 - 저장공간

          변수명 = new 자료형[];

 

int scores;    //선언

scores = new int[5];   //생성

 

 

배열의 선언, 사용방식

* ArrayEx01.java

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

        //배열의 선언
        int[] arr1;

        //System.out.println(arr1);  배열을 초기화하지 않으면 에러남


        //배열의 생성
        arr1= new int[3];
        System.out.println(arr1);  //[I@4517d9a3 배열을 생성한 후 배열을 출력하면 저장주소가 뜸


        //배열의 초기화
        arr1[0]=10;
        arr1[1]=20;
        arr1[2]=30;

        System.out.println(arr1[0]);
        System.out.println(arr1[1]);
        System.out.println(arr1[2]);

        int a;
        a=10;
        System.out.println(a);   //기본 자료형에는 값이 들어있는 것
        //참조 자료형에서는 값이 아닌 값이 있는 주소가 들어있는 것이다.
    }
}

 

## arr1[3]이라는 공간이 없는데 해당 배열에 값을 할당한 경우

=> compile은 되지만, 실행할 때 에러발생 (만들어진 배열에는 해당 공간이 없다는 내용의 에러)

  //Compile에러는 없음
        //runtime에러 = Exception(에러의 다른 표현)
        //ArrayIndexOutOfBoundsException
        //arr1[3]=40;

        System.out.println(arr1[2]);
        //System.out.println(arr1[3]);   //ArrayIndexOutOfBoundsException

 

 

* ArrayEx03.java  - 선언과 생성, 배열 안 정수 내용 확인

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

        //선언과 생성을 분리
        int[] arr1;
        arr1= new int[3];
   
        //선언과 생성을 통합
        int[] arr2= new int[3];

        //선언과 생성과 초기화 통합
        int[] arr3 = new int[]{10,20,30};
        int[] arr4 = {10,20,30};

        System.out.println(arr1.length);
        System.out.println(arr2.length);
        System.out.println(arr3.length);
        System.out.println(arr4.length);
       
       /*  for(int i=0;i<arr4.length;i++){    //데이터를 읽어오는 전통적 방식
            System.out.println(arr4[i]);
        }*/

        //향상된 for문
        for(int data : arr4){
            System.out.println(data);
        }
    }
}

+) 문자와 문자열 확인

 int[] arr1={10,20,30};
        char[] arr2 ={'a','b','c'};

        for(char data:arr2){
            System.out.println(data);
        }

        String[] arr3={"abc","bds","dge"};
        for(String data2:arr3){
            System.out.println(data2);
        }

 

* ArrayEx05.java  - 이차원 배열의 선언

public class ArrayEx05 {
    public static void main(String[] args) {
       //다차원 배열
       //이차원 배열
       int[][] arr1;
       arr1 = new int[3][2];
       arr1[0][1]=10;
       arr1[0][2]=20;
       arr1[1][1]=30;
       arr1[1][2]=40;
       arr1[2][1]=50;
       arr1[2][2]=60;
       
       System.out.println(arr1[0][0]);
       System.out.println(arr1[2][1]);

       int[][] arr2 = new int[3][2];
       int[][] arr3 = new int[][]{{10,20},{30,40},{50,60}};
       int[][] arr4 = {{10,20},{30,40},{50,60}};
   
       

    }
   
}

 

+) 이차원 배열과 향상된 for문 적용

public class Ex5_8 {
    public static void main(String[] args) {
       int[][]score={
        {100,100,100},
        {20,20,20},
        {30,30,30},
        {40,40,40}
       };
 
       int sum=0;
      /*  for(int i=0;i<score.length;i++){
        for(int j=0;j<score[i].length;j++){
            System.out.printf("score[%d][%d]=%d%n",i,j,score[i][j]);

            sum+=score[i][j];
        }
       }
       System.out.println("sum="+sum);
    */
       
       //향상된 for문  //추가 이해 필요
       for(int[] cols : score){
        for(int data2: cols){
             System.out.println(data2);
             sum+=data2;
        }
       }

       System.out.println("sum="+sum);
    }
   
}

 

+) 2차원 배열을 통한 성적 계산

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

        int[][] score ={
            {100,100,100},
            {20,20,20},
            {30,30,30},
            {40,40,40},
            {50,50,50}
        };

        int korToral= 0, engTotal=0, mathTotal=0;

        System.out.println("번호 국어 영어 수학 총점 평균");
        System.out.println("================================");

        for(int i=0;i<score.length;i++){
            int sum =0;
            float avg =0.0f;

            korToral += score[i][0];
            engTotal += score[i][1];
            mathTotal += score[i][2];
            System.out.printf("%3d",i+1);

            for(int j=0;j<score[i].length;j++){
                sum+= score[i][j];
                System.out.printf("%5d",score[i][j]);
            }

            avg=sum/(float)score[i].length;
            System.out.printf("%5d %5.1f%n", sum,avg);

        }
        System.out.println("================================");
        System.out.printf("총점:%3d %4d %4d%n", korToral,engTotal,mathTotal);

        }
    }
   

+) 3차원 배열 출력

  //3차원 배열을 선언하고 출력

      int[][][] arr=new int[3][][];

      arr[0]= new int[][]{{10,20,30},{40,50},{60}};
      arr[1]= new int[][]{{70,80,90},{100,110},{120}};
      arr[2]= new int[][]{{130,140,150},{160,170},{180}};

      System.out.println(arr[2][0][1]);
 
 

 

* ArrayEx08.java - args배열의 길이로 입력한 만큼 다시 출력

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

      //배열의 길이
      System.out.println(args.length);
      //자료형:String
      //System.out.println(args[0]);

      //입력한 모든 값을 가져오고 싶을 때
      //전체 파라메터(아규먼트)
      for(int i=0;i<args.length;i++){
        System.out.println(args[i]);
      }


    }
}

 

* ArrayEx10.java - 피연산자와 연산자 입력 시 해당 값을 계산해주는 프로그램 (계산기)

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

      // 숫자 연산자 숫자 => 연산결과 출력되는 프로그램


   if(args.length!=3){
        System.out.println("입력이 잘못되었습니다");
      }else {
        int num1 = Integer.parseInt(args[0]);
        int num2 = Integer.parseInt(args[2]);

        int result =0;

        switch(args[1]){    //계산부
          case "+":
            result=num1+num2;
            break;
          case "-":
            result=num1-num2;
            break;
          case "x":
            result=num1*num2;
            break;
          case "/":
            result=num1/num2;
            break;
        }


        //출력부
        System.out.println(num1+" "+args[1]+" "+num2+" = "+result);
      }

    }
}

 

 

* ArrayEx11.java - 10개의 숫자 입력 후 해당 숫자의 최대값과 최소값 찾기

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

      //10개의 수를 입력받아서 최대값과 최소값을 출력하는 프로그램

      if(args.length!=10){
        System.out.println("입력이 잘못되었습니다");
      }else {
        int min= Integer.parseInt(args[0]);
        int max=Integer.parseInt(args[0]);

        for(int i=0;i<args.length;i++){
          if(min>=Integer.parseInt(args[i])){
              min=Integer.parseInt(args[i]);
          }
        }
        for(int i=0;i<args.length;i++){
          if(max<=Integer.parseInt(args[i])){
              max=Integer.parseInt(args[i]);
          }
        }
        System.out.println("최소값: "+ min);
        System.out.println("최대값: "+ max);
     
      }
    }
}

 

 

순차처리 프로그래밍

(위->아래)

 

구조적 프로그래밍

-함수

 

[ 객체지향 (중심) 프로그래밍 (Object Oriented(중심) Programming) ]

    - 공통적 내용을 추출한 정의

 

 

객체 모델링(Object Modeling) -기획의 자료

             UML(Unified Modeling Lang)

* UML

- class diagram

- use case diagram (기능)

- sequence diagram(함수호출)

 

클래스 (class) 

!!!소스파일의 이름은 class의 이름과 동일해야한다!!!

사용자 정의 클래스 - 문법

라이브러리 / API

                   내장 클래스 - 사용법

                   외부 클래스 

 

 

class 클래스명 {

                 멤버필드;

                 메서드;

}

 

클래스명

- 식별자 규칙

- 대문자로 시작

 

학생관리 프로그램

이름       번호   나이   키    몸무게

홍길동    1001  20    180     80

손수빈    1002  23     163    55

 

학생

이름 

번호

나이 

몸무게

 

클래스 선언

class Student {

              String name;

              String number;

              int age;

              double height;

              double weight;

}

 

# 클래스의 인스턴스화

- 클래스로부터 객체를 만드는 과정

 

 

* MethodEx01.java - 클래스/메서드 선언 + 인스턴스 생성

class Method{   //클래스를 먼저 선언

    //메서드의 선언
    void doFunc1(){
        //지역변수
        //제어문
        //실행문
        System.out.println("doFunc1() 호출");    //메서드를 사용하려면 클래스 안에 담아야함
    }

    void doFunc2(int data1){
        System.out.println("doFunc2() 호출: "+ data1);
    }
   
    // 리턴이 없으면 void
    void doFunc3(int data1, int data2){

        //지역변수 - 초기화 후 사용
        int num=1;
        System.out.println("doFunc3() 호출: "+ data1+data2);
        System.out.println("doFunc3() 호출: "+ num);
    }

    //리턴에 대한 자료형
    int doFunc4(int data1, int data2){    
        int sum = data1+data2;
        return sum;
    }
}

public class MethodEx01 {
    public static void main(String[] args) {
        Method m1=new Method();  //인스턴스 생성
        m1.doFunc1();
        m1.doFunc2(10);
        int sum = m1.doFunc4(100, 200);
        System.out.println("출력결과: "+sum);


        Method m2=new Method();
        m2.doFunc1();
        m2.doFunc3(30, 15);
    }
}

 

 

* MethodEx02.java  - 최대값 찾기

class Util{   //클래스를 먼저 선언

   int viewMaxNumber(int data1,int data2, int data3){

    int max=data1;
        if(data1>=data2&&data1>=data3){
            max=data1;
        }else if(data2>=data1&&data2>=data3){
            max=data2;
        }else if(data3>=data1&&data3>=data2){
            max=data3;
        }

    return max;
   }
}

public class MethodEx02 {

    public static void main(String[] args) {
        Util max1=new Util();
        int max= max1.viewMaxNumber(20, 20, 40);
        System.out.println(max);
    }
   
}

 

 

* StudentMain01.java - 참조변수 선언과 생성

//class 선언
class Student {

              String name;
              String number;
              int age;
              double height;
              double weight;

}

public class StudentMain01{
    public static void main(String[] args) {
        //참조변수 선언
        Student stu1;
         
        //참조변수 생성
        stu1 = new Student();  //인스턴스

        //초기화->멤버필드 초기화
        stu1.name="홍길동";
        stu1.number="1001";
        stu1.age=20;
        stu1.height=180;
        stu1.weight=80;

        //초기화 시킨 멤버필드를 출력
        System.out.println(stu1.name);
        System.out.println(stu1.number);
        System.out.println(stu1.age);
        System.out.println(stu1.height);
        System.out.println(stu1.weight);


        //stu2인스턴스 생성
        Student stu2= new Student();
        stu2.name="손수빈";
        stu2.number="1002";
        stu2.age=23;
        stu2.height=163;
        stu2.weight=55;

        System.out.println(stu2.name);
        System.out.println(stu2.number);
        System.out.println(stu2.age);
        System.out.println(stu2.height);
        System.out.println(stu2.weight);


       
        System.out.println(stu1); //참조값 확인
        System.out.println(stu2);
    }
}

 

 

* OverloadEx01.java - 오버로딩

class Overload{    //오버로딩의 조건을 나열
    //오버로딩 - 이름이 같아도 매개변수가 다르면 서로 구별될 수 있는 것
    //1. 메서드 이름이 같아야 함
    //2. 매개변수의 개수 또는 타입이 달라야 함
    //3. 반환 타입은 관계없음


    void doFunc(){
        System.out.println("doFunc() 호출1");
    }

    void doFunc(int a){
        System.out.println("doFunc(int a) 호출");
    }
   
    void doFunc(String s){
        System.out.println("doFunc(String s) 호출");
    }

    void doFunc(String s, int a){
        System.out.println("doFunc(String s, int a) 호출");
    }

    void doFunc(int a, String s){
        System.out.println("doFunc(int a, String s) 호출");
    }
}

public class OverloadEx01{
    public static void main(String[] args){
        Overload ol= new Overload();
        ol.doFunc();
        ol.doFunc(0);
        ol.doFunc("string");
        ol.doFunc("string",50);
        ol.doFunc(70,"string2");
    }
}

 

+)  실제 오버로딩이 쓰여지고 있음을 확인 (오라클 문서)

출처:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html

 

* MethodEx03.java - 가변인자 

class Util{  

    void doGugudan(String ... args){
        System.out.println("                  ");
        for(int i=0;i<args.length;i++){  
            System.out.println("    ");
            for(int j=1;j<=9;j++){
                System.out.println(Integer.parseInt(args[i])+"x"+j+"="+ Integer.parseInt(args[i])*j);
            }
        }  
    }
}

public class MethodEx03 {
    public static void main(String[] args){
        Util u = new Util();
        u.doGugudan("1");
        u.doGugudan("1","2");
        u.doGugudan("1","3","5");
      }
}


/*다른방법
 Class Util{
    void doGugudan(int ... dans){
        for(int dan : dans) {
            for(int i=1; i<=9;i++){
                System.out.printf("%2d x%2d =%3d\t", dan ,i,(dan*i));
            }
            System.out.println();
        }
    }
 }

 */

 

* Exercise6_2.java - 학생 클래스 만들고 점수 합계와 평균 계산

//class 선언
class Student{
   
              String name;  //학생이름
              int ban;      //반
              int no;       //번호
              int kor;      //국어점수
              int eng;      //영어점수
              int math;     //수학점수

    Student(String name, int ban, int no, int kor, int eng, int math){
        this.name=name;
        this.ban=ban;
        this.no=no;
        this.kor=kor;
        this.eng=eng;
        this.math=math;
    }

    int getTotal(){
        return kor+eng+math;
    }

    float getAverage(){
        return (int)(getTotal()/3f*10+0.5f)/10f;
    }
    String info(){

       // double sum= kor+eng+math;
       // double avg=sum/3;
        String str=name+","+ban+","+no+","+kor+","+eng+","+math+","+getTotal()+","+getAverage();

        return str;
    }


}

public class Exercise6_2{
    public static void main(String[] args) {
        Student s = new Student("홍길동", 1, 1, 100, 60,76);

        String str =s.info();
        System.out.println(str);
    }
}




+) 다르게 표현하기

public class Exercise6_3{
    public static void main(String[] args) {
        Student s = new Student();
        s.name ="홍길동";
        s.ban=1;
        s.no=1;
        s.kor=100;
        s.eng=60;
        s.math=76;
        System.out.println("이름: "+s.name);
        System.out.println("총점: "+s.getTotal());
        System.out.printf("평균: "+s.getAverage());
    }
}

class Student{
   
              String name;  //학생이름
              int ban;      //반
              int no;       //번호
              int kor;      //국어점수
              int eng;      //영어점수
              int math;     //수학점수


    int getTotal(){
        int sum= kor+eng+math;
        return sum;
    }

    float getAverage(){
         return (int)(getTotal()/3f*10+0.5f)/10f;
    }
   

}



=> 향상된 for문에 대한 추가적인 공부 필요 (각 인자에 대한 내용 이해 부족)

=> Exercise6_2.java (해결완료)

     문제상황: 숫자 계산에서 double형을 다시 intger로 바꾸고 싶었는데 해당 부분에서 오류가 생겼다.

  •      Integer.parseInt 써봄
  •      int로 계산하고 Double.parseDouble사용해서 바꿔봐도 나오지 않음 (해결하기) ==> 수정 완료

해결방법: float형으로 소수점 출력을 한자리만 나올 수 있도록 하였다.

728x90
반응형