언어/java

자바 Class

Eprld 2024. 2. 12. 15:05

/*
 * 자바문법의 기초 : 자바의 소스파일명과 클래스명은 대소문자까지 같아야 합니다.
 * 또한 클래스 내부에 모든 코드가 들어가야 합니다.
 * 즉 모든 실행 명령은 클래스바디{} 내에 위치해야 합니다
 * 코딩을 함과 동시에 컴파일이 이뤄지며, 클래스 파일이 생성되는데, 항상 문법적인 부분을 조심하세요
 * 
 * 컴파일러는 문법에서 오류가 발생하면, 오류 내용과 함께 위치를 알려줍니다.
 * 
 * 여러분은 그 부분을 확인해서 디버그를 해서 문법적 오류가 없는 코드를 작성해야 합니다.
 * 
 * 중요!! 실행 가능한 클래스 파일은 하나부터 수천개까지 정의할 수 있습니다.
 * 이때, 처음 시작하는 시작점이 있는데, 여러분이 실행 명령을 내리면 , 클래스가 Java VM 의 메모리에 로드가 되고 
 * VM이 실행되는앱의 시작점을 자동으로 찾아서 호출 하는데, 그게 main 메서드 입니다.
 * 
 * 이 메서드는 수천개의 클래스가 있어도, 반드시 하나만 존재 해야하며, 이 메서드를 갖는클래스가 메인 클랙스가 되어야 합니다.
 * 
 * 꼭 기억 때문에, 이 메인 메서드는 반드시 아래와 같은 형식을 가져야 합니다.
 * 
 * public static void main(String[] a[rgs]){
 * main 메서드 body..
 * }
 */

 

 

public class DataTypeEx {//class body
   
   
   /*
    * 자바의 데이터 타입(type) : 크게 2개로 구분할 수 있으며, 다시 세분화되어 구분되어집니다.
    * 
    * 크게는 객체 타입(Reference type 일명 R  타입)과, 원시형(Primitive type 일명 p type)으로 구분되어 집니다 
    * 
    * 객체와 비객체로 나눠짐
    * 
    * 객체타입은 나중에 배움 먼저 p 타입
    * 
    * 데이터 타입이란 변수 또는 변수가 없는 메모리, 즉 실제 값을 담는 영역인 메모리에 어떤 타입과 크기의 값이 들어가느냐에 
    * 따라서 결정을 짓는것을 말합니다
    * 
    * 
    * 꼭 기억 : 자바에서는 변수가 처음 선언되어질때 반드시 왼쪽에 변수가 담을 값에 타입과 범위를 감안해서
    * 적절한 타입을 지정해야 한다
    * 그렇지 않으면 에러임
    * 
    * 또한 해당 타입은 메모리에서 사라질때까지 절대 변경 되지 않음 매우중요!!!
    * 
    * 자바는 데이터타입에 매우 엄격하기 떄문에, 위 두조건중 하나라도 만족되지 않으면 바로 에어를 유발 하거나, 실행시에
    * 예외(Exception)을 발생시킵니다
    * 
    * p type 은 아래처럼 구분되어짐
    * 
    * 1.수치형 (괄호내의 값은담을 수 있는 크ㅅ기를 나타냄)
    *  a. 정수형 : byte(1byte), short(2byte) , int(4byte, default) , long(8byte)
    *  
    *  2. 문자형(유니코드를 기반으로 하는 정수타입입니다.) 음수가 없는 양수로만 구성되어 잇고ㅡ char 라는 타입으로 지정 됩니다.
    *  크기는 대락(0~65,500) 까지로 담습니다
    *  
    *  3.boolean : 자바스크립트와는 틀리게 오직 true /false 만 담을 수 있음
    *  
    *  !!!! 문자열은 객체(Rtype) 으로 처리되어집니다. ""을 이용해서 리터럴로 사용가능합니다
    *  
    *  리터럴형은 데이터 타입을 선언하지 않고 사용되는 데이터 그 자체를 말합니다.
    *  ex> 2 + 3 = 2 와 3은 변수에 담지 않았지만 내부적으로는 int 로 처리 되어집니다. 2,3을 리터럴 데이터라고 함 
    */

   public static void main(String[] args) {
      /*
       * 데이터 타입 실행전에, 변수의 특징부터 알아봅시다.
       * 변수는 선언, 대입, 초기화 스크립트와 같습니다.
       * 단 틀린점은, 값이 초기화 되기전에 사용되면 무조건 에러입니다.(undefined 이런거 없음)
       */
      
      
      
      
      byte b1;//byte 타입의 b1 선언함 메인 메서드의 지역 변수
      byte b2,b3;//한 라인에 같은 타입의 변수를 , 를 기준으로 연속 선언 가능함
      byte b4 = 10; //b4 초기화
      
      
      //값 초기화 이전에 사용시 에러 보기
      //System.out.println(b1);
      
      //올바른 사용예
      System.out.println(b4);
      
      b2 = -10;
      System.out.println(b2);
      
      //b3 = 1.0;
      
      //byte -128 ~ 127 의 정수를 담는 타입인데, 범위가 너무 작지않나?
      
      //나중에 배우겟지만 byte 는 정수를 연산하는데 사용하는 목적이 아닙니다
      //내부적으로 문자를 처리하기 위한 용도의 목적이다
      //간단한 예를 들자면, 여러분이 카카오톡 채팅을 할 떄 화면에 ㄴ한글로 표기되지만
      //전송을 누르는 순간, 프로그램에서는 모두 byte 로 변환되어서 네트워크를 타고
      //상대편에 전달된후 다시 문자열로 원복되는 과정을 거침

 

//short 는 죽은 데이터 타입입니다(안 쓰임)
      
      //int 정수형의 기본 데이터 타입입니다
      //사용목적으로는 연산 및 문자 등을 표현할 때 사용합니다
      //우리 자바스크립트 시가넹 문자셋 했던 거 기억?
      //그떄 유니코드 (UTF8) 은 전세계 문자셋을 정수 테이블로 관리한다고 했는데
      //int 역시 정수연산과 다국어 문자 표기를 호환하기 위해 존재한다.
      //default 타입이란, 타입선언 없이 값을 사용시에, 그 값을 판단하여 적절한 메모리를 만들어서 사용하는 것을 말합니다
      //ex> 2+3 --> int 메모리 생성, 값 2 초기화 + int 메모리 생성,  값 3 초기화 이후 + 연산 및 결과 반환
      
      //연산 및 결과 타입 : 자바에서는 정수만 기준으로 설명하면, 리터럴 + 리터럴을 처리할 때, 내부적으로는 
      //int 메모리 2개를 만들고 값 대입후 연산, 그리고 값이 담긴 타입을 리턴시킴 즉 int 가 리턴이 됨
      
      //기본타입이란 말은 위처럼, 만약 int 이하 타입끼리 연산이 될 경우에는 연산정에 무조건 타입을 먼저 보고 
      //둘다 int로 먼저 변경을 해서 (정확히는 int 메모리 두 개를 더 만들어서 기존값을 복사해서 넣고)
      //그 int 두개를 연산후 int 로 되돌려 줌
      

 


public class OutPuyConsole {

   public static void main(String[] args) {
      //출력문 기능 몇가지 알아볼게요..print, println, printf(포맷출력)
      //먼저 자바에서도 문자열 + 모든datatype 의 결과는 문자열임

      String msg = "10";
      
      msg = msg + 10;
      
      System.out.println(msg); //1010문자열로 출력됨
      
      //escape 문자 .. 역슬래쉬를 이용해서 표현 합니다.
      
      System.out.println(msg + "\n" + "hi");//라인 개행
      System.out.println(msg + "\n\t" + "hi");//라인 개행 후 tap 만큼 들여쓰기
      System.out.println(msg + "\n\t" + "\"hi\"");//라인 개행 후 tap 만큼 들여쓰고 " "표시
      System.out.println(msg + "\n\t" + "\'hi'");//라인 개행 후 tap 만큼 들여쓰고 ' '표시a
      
      //println() 은 내용을 출력후 자동줄바꿈합니다
      //print() 는 내용 출력 후 줄바꿈 하지 않고, 다음 내용을 이어서 계속 출력 합니다
      
      Systehttp://m.out.print("Hello");
      System.out.println("World");
      
      //jdk 1.5부터 지원된 c, c++ 의 포맷 출력 printf("포맷지사자 n1,n2,,,n", value,v2 ...n 갯수가 같은 수의 vlaue )
      //각 지시자는 % 키워드를 이용해서 표시합니다
      //지시자 키워드는 n(뉴라인), 0 : 자릿수 지정시 공백을 0 으로 재움, - 전체 자릿수가 지정된 경우  좌정ㅇ여 후 출력
      //.m : 소수점 아래 자리수 지정 표식자.. 잘리는 소수점 자릿수는 반올림됨..
      
      //아래는 값을 지정하는 표식자(값은 데이터 타입에 종속적이기 때문에, 타입의 키워드만 알면 쉬움)
      /*
       * %b : boolean 형식으로 출력(이후 % 생략)
       * d(disimal) : 십진수, o : 8진수, x : 16진수
       * f : 실수 표현
       * c : 문자 하나 표현 (char) //자바는 문자열과 문자는 완전 다른 타입(String(R trpe), char(p type))
       * s : 문자열 표식자...
       * 
       */

      
      int age = 31;
      String name = "최주현";
      
      
      //System.out.println();
      Systehttp://m.out.printf("내 나이는 %d 고, 이름은 %s 입니다.%4 6789n", age,name); //오버로딩   
      
      double avg = 1.245678;
      Systehttp://m.out.printf("소숫점출력 합니다... avg 값 : %f%n", avg);
      Systehttp://m.out.printf("소숫점 출력 하는데 자릿수 지정 ... avg (소수 3자리 반올림) 값 : %.3f%n", age,name);
      
      
      
      
   }

}

 

 

public class Fruit{
   
   /*
    * 첫 번째 퀴즈 : 여러분이 과수원을 한다 라고 가정하고 아래의 로직을 작성해서 결과를 도축
    * 
    * 과수원에는 사과, 배, 오랜지 를 키우고 있음
    * 
    * 하루동안 각각의 생산량은 14, 7, 14 입니다
    * 
    * 그럼 하루동안 생산되는 총 과일의 수량과, 시간당 몇 개가 생산되는 지를 출력
    * 
    * ex>총 생산량 : x개, 시간당 생산량 : x.x개
    * 
    * 조건 : 
    * 1. 반드시 변수를 3개 이상 사용해야 함
    * 2. 반드시 한번의 리터럴 데이터 사용
    * 3. 반드시 한 번의 케스팅 사용
    * 4. 평균값은 float 타입으로 처리
    * 
    * 
    */
   
   public static void main(String[] args) {
      
      int apple = 14;
      int pear = 7;
      int orange = 14;
      
      
      
      float total = (float)((apple + pear + orange) / 24.0) ;
      
      System.out.println(apple + pear + orange);
      System.out.println(total);
      
      /*
       * int app, ora, pear, total;
       * total = app +ora + pear;
       * 
       * avg + (float)(total / 24.0); 
       * System.out.println("총 생산량 : " + total); 
       * System.out.println("시간당 생산량 : " + avg);
       */
      
      //필요하다면 하나의 소스 파일에 하나이상의 클래스를 정의할 수 있습니다.
      //단!!! main() 을 가지고 있는 클래스가 파이명이 되어야 학,
      //클래스명앞에 있는 public 키워드는 오직 메인 클래스만 가져야 합니다
      //클래스를 정의 하는 위치는 전혀 상관이 없습니다.

      
      
   }
} import javax.swing.JOptionPane;

public class FindLetter {

   public static void main(String[] args) {
      /*
       * 0~127 까지의 랜덤한 정수를 발생
       * 이 수가 아스키코드의 어느 범위의 문자인지를 확인하는 코드
       * 범위는 다음과 같음
       * 
       * 숫자 이전의 문자, 숫자, 숫자와 영대문자 이전의 특문, 영대문자 와 영소문자 사이의 특문,
       * 영소문자 이후의 특문
       * 
       * 위 범위를 찾아내서 결과는 다음처럼
       * 
       * ex>m 발생시 소문자 m 발생 / 발생시(만약 영문자 사이의 특문) 영문자 사이의 특문"/" 발생
       
   */
   
      char a = (char)(Math.random()*128);
      
      if(a < '0') {
         System.out.println("숫자 이전의 특문 :" + a);
      }else if(a >= '0' && a <='9'){
         System.out.println("숫자 문자 :" + a);
      }else if(a > '9' && a < 'A') {
         System.out.println("숫자와 영대문자 사이의 특문 :" + a);
      }else if(a >= 'A' && a <= 'Z') {
         System.out.println("영대문자 :" + a);
      }else if(a > 'Z' && a < 'a') {
         System.out.println("영문자 사이의 특문 :" + a);
      }else if(a >= 'a' && a <= 'z') {
         System.out.println("영소문자 :" + a);
      }else if(a > 'z') {
         System.out.println("영소문자 이후의 특문 :" + a);
      }
      
      
   if(Character.isDigit(a)) {
      System.out.println("숫자문자 발생" + a);
   }else if(Character.isUpperCase(a)) {
      System.out.println("영대문자 발생" + a);
   }else if(Character.isLowerCase(a)) {
      System.out.println("영소문자 발생" + a);
   }else {
      System.out.println("특문 발생" + a);
   }
      
      
      //System.out.println("숫자 이전의 특문" + "\" + a + "\" + "발생함");
      
      
      
      //자바프로그램을 명시적으로 완전히 종료하는 API
       //자바 Process 가 완전히 종료
       System.exit(0); //비정상 종료시엔 -1 을 대입하지만,, 대부분 0을 씀
   
      
      
      /*
 * Java Array : 배열은 객체입니다. 그러나, 속성 딱 하나만 존재합니다.
 * 속성은 length 이며, 배열의 길이를 리턴합니다.
 * 배열의 목적은 하나 이상의 값을 하나의 변수에 할당해서 관리하는데 잇음
 * 이렇지 않을 경우엔 값마다 변수를 모두 지정해야 하느데 그게 힘들어서 배열이 나온거임
 * 
 *  1.자바 배열은 객체이다,, 즉 배열을 생성하면 heap 메모리 영역 (모든 instance 가 생성되는 동적 영역)에 instance 가 생성되며
 *  VM은 생성된 instance 의 Reference 를 무조건 return 한다
 * 
 * 프로그래머는 목적에 따라서 리턴된 Ref 를 변수에 담아서 계속 사용하는 것임
 * 
 * 해서, 이 변수를 우리는 객체라고 부르게 된 것임
 * 
 * 2.자바는 타입이 매우 엄격하기 때문에 , 배열을 생성시엔 타입이 명시되어야 하고 값도 해당 타입이거나 하위 타입이어야 함 
 * 만약 하위 타입이 값으로 들어가면 들어가는 순가 ㄴ배열 타입으로 변경됨
 * 
 * 3. 자바 배열은 객체이기 떄문에 P or R 타입 모두를 값으로 갖는 배열을 생성할 수 잇음
 * 이 말은 특정 타입을 객체로 배열의 요소(값)으로 담을 수 있다는 뜻임 당연히 타입은 해당 값의 클래스로 선언 되어야 함
 * 
 * 4. 배열의 값을 주지 않고 길이만 주고 생성할 수 잇고, 이럴경우 무조건 해당 타입의 default 값으로 초기화 되어짐
 * 
 * 5. 배열의 길이를 주지 않고 생성 될 수 없음
 *  
 * 6. 배열은 초기값을 주고 생성될 수 있음
 *  
 * 7. 배열의 크기는 인위적으로 변경 불가능 변경하고 싶으면 새로 생성해야함
 */
import java.util.Arrays;

public class ArrayEx {

   public static void main(String[] args) {
      
      
      System.out.println(args[0] + args[1]);
      
      //배열의 문법
      //1.크기만 주고 생성하기
      
      int[] inArr = new int[5];//5개의 배열생성됨.
      boolean boArr[] = new boolean[3];
      
      System.out.println(inArr);//배열객체를 출력문에ㅐ 넣으면 HashCode 리턴
      //(생성된 instance 의 16진수로 된 메모리 값 @ 를 기준으로
      //앞은 인스턴스의 타입을 뒤는 메모리 주소의 HashCode 룰 나타냅니다)
      
      //배열의 값이 뭔지를 문자열로만 확인 할 떄는 Array class 의 toString()을 이용하면 됩니다

System.out.println(Arrays.toString(inArr));
System.out.println(Arrays.toString(boArr));

       

   }

}
      
      
/*
 * 메서드 오버로딩 : 결론만 말하자면 메서드를 호출할 때 같은 이름의 메서드가 여럿 존재시
 * 메서드의 시그니처 를 보고 VM 동적으로 호출하느 ㄴ개념
 * 
 * 이렇게 하는 이유는 전에도 말햇듯이 전체적으로 보면 같은 기능을 하는 메서드 인데 Detail 이 조금씩 틀린 경우
 * 메서드 이름을 다르게 하려면 이름짓기도 힘들고 , 자칫 이름을 잘못 해석해서 사용을 잘못하게 하는 것을 방치하기 위함
 * 
 * 이렇듯 이름이 같은 메서드를 시그니처만 틀리게 하여 정의 하는 것을 메서드 오버로딩이라 한다
 * 
 * 이 논리는 생성자에서도 사용됨 기억하셈
 * 
 * //void 안에 있는 클래스 넣으면 안댐
 * 
 * 시그니처
 * 1. 메서드 이름은 무조건 같아야 함/리턴타입 또한 같아야함
 * 2. 메서드 args 의 타입 순서 갯수 를 시그니처라고 함
 * 3. 위 시그니처 중 하나라도 틀리면 오버로딩 가능
 * 4. 한 클래스에서는 시그니쳐가 같은 메서드는 하나이상 재선언 불가능
 */
public class MethodOverloading {

   public static void main(String[] args) {
      //범위내의 랜덤 얻어내기
      int r = getRandom.postRandom(10, 20);
      System.out.println(r);
      
      System.out.println(getRandom.postRandom(10, 20)); //void 안에 있는 클래스 넣으면 안댐

   }

}     
      
      
/*
 *메서드 호출시에 전달되는 파라미터의 특징에 대한 내용(Call By Value & Call By Reference)
 *
 * 메서드 호출시에 전달되는 파라미터의 타입에 따라서 위 두 개중의 하나가 실행 됩니다.
 * 
 * 이중 CallByValue 는 오직 Ptype 인 경우만 발생, Rtype 은 CBR로 무조건 진행됨 
 * 
 * CallByValue 란 p 타입의 데이터가 파라미터로 전달될 떄는 중간에 VM 이 전달하려는 파라미터를 복사하고 그 복사된 값을 호출되는
 * 메서드에 파라미터로 전달한다는 것
 * 
 * 이말은 즉 메서드에서 전달된 값은 어느쪽에서 변경을 하던 말던 전혀 별개로 취급되어진다는 뜻(영향미치지 못함)
 * 
 * CBR은 반대임
 */



public class Method_CallByValue_Exam {

   

   
   public static void main(String[] args) {
      int a = 1;
      
      
      System.out.println("doSome(int a ) 호출후 main 의 a 값 : " + a);
      
   }
   
   static void doSome(int a) {
      a += 100;
      System.out.println("호출된 메서드에서의 a 값 : " + a);
   }

}      
      
      
   /*
 * Java Method : 자바에서 method 는 매우 중요함
 * 
 * 1.메서드의 정의 형태 : 메서드는 클래스 내부애ㅔ 정의하느 기능을 담당하는 주체
 * 미 메서드는 겅계목적에 따라 static, none-static 으로 정의 
 * 
 * 메서드를 정의하는 목적은, 객체지향에서는 모든 프로그램이 진행될때, 각각의 목적 또는 대상을 클래스로 설계후 객체를 생성해서
 * 그 객체의 메서드를 통해 특정 기능을 수행하면서, 프로그램의 연산, 연산 후 결과 등을 되돌리거나(return) 되돌리지 않거나(void)
 * 하도록 하는 것
 * 
 * 때문에 메서드는 특정 클래스가 어떤일을 할 지를 결정해서 그 구현을 매서드로 정의 필요시에 호출을 통해
 * 그 기능을 사용 또는 재사용하는 목적
 * 
 * static 으로 선언된 메서드는 객체 생성없이 사용 할 수 있다는 게 특징
 * 
 * 이러한 특징 떄문에 같은 클래스 내에서 정의된 static 키워드가 붙은 애들끼리만 호출가능
 * 
 * 메서드 문법 : [접근제어자(Access Modifier ) (public, protected, default(pakage), private] [static] return type 
 * name([args], type name, type name, type name...n개의 type name){
 *        method body define
 *        
 * 위에서 만약 args 를 선언하면 해당 args 는 이 메서드 내부에서느 ㄴ지역 변수로 인식
 * 떄문에 메서드가 종료되면 해당 변수도 사라짐 같은 이름의 다른 메서드에서도 사용 가능 
 *        
 * 메서드의 리턴타입에는 P or R 로 구분 되어지는데, R 타입인 경우엔 객체를 리턴하겠다는 의미로, 그 객체의 원형(prototype)인
 * 클래스 또는 상속을 해준 부모클래스 or 인터페이스를 선언 
 * 
 * p 타입을 리턴할 경우앤, 정확한 타입을 명기함 정수인 경우엔 정수타입종류, 실수는 실수타입, 불린 OR char 등...
 * 단 리턴하는 값보다 큰 타입으로 선언 가능 하지만 작은 타입으로는 선언 불가능(Promotion 생각)      
 *        [return or return value](꼭  기억 리턴 타입이 void 아닌 경우엔 반드시 선언된 타임의 value 를 리턴)
 * }       
 * 
 */

import javax.swing.JOptionPane;

public class MethodExam {
   
   //자바에서는 전역 변수란 개념은 없고, 같은 의미 및 더 추가 개념으로 공유변수라는 개념 사용
   //이 공유변수는 소속이 객체가 아닌 클래슥가 가지고 있게 되면  공유변수개념이 댐
   //이 클래스가 가지고 있는 변수(즉 클래스 변수)를 static 변수라고 함
   
   static boolean goGame = false;

   
   public static void main(String[] args) {
      
      
      sayMessage();
      
      String input = JOptionPane.showInputDialog("y/n 입력해");

      int res = startGame(input);
      
      System.out.println(res);
      int r = getRandom.postRandom();
      int doSome = (int)r;
      
      while(goGame) {
         
         
         
         System.out.println("게임이 시작되었습니다." );
         return;
         //위 goGame 이 true 라면 게임시작.
      }
      
      static doSome(int r) {
         
      }
      
      System.out.println("잘못된 입력 이거나 게임을 원치 않기에 프로그램을 종료함");
      System.exit(0);
   }
   
   
   
   static void sayMessage() {
      JOptionPane.showMessageDialog(null, "게임월드에 오신 걸 환영합니다");
   //   System.out.println("안녕하세요. 게임 월드에 오신 걸 환영합니다.");
   }
   
   //게임시작을 원하는 지 여부를 판단, 입력값의 결과를 되돌려 주는 메서드 정의함.
   static int startGame(String input) {
      //int result = -1;//-1(틀린 키워드),0(go game),1(no game) 
      
      switch (input) {
      case "y":
         goGame = true;
         return 0;
      case "n":
      
            return 1;
   
      }
      
      return -1;
   }

}   
      
      
/*
 * 자바 다차원 배열 : 모든 프로그램에서는 다차원 배열을 지원 합니다.
 * 자바도 마찬가지임. 다차원 배열이란, 배열 내부에 다시 베열을 넣은 것을 말합니다.
 * 이럴때, 실제 Date(값) 은 내부배열(inner array) 에 존재하게 됨
 * 다차원 배열을 연상할 떄, 외부 배열은 Outer, 내부는 inner 
 * 
 * 이렇듯 다차원 배열은 배열 내부에 배열이 존재하는 것이기 떄문에, Outer 의 각 index 에는 배열이 다시 할당되어짐
 * 
 * 이 말은 Outer 의 길이 (length) 외에 outer 의 각 index 에는 다시 내부 배열의 길이를 리턴하는 length 가 존재 한다느 말
 * 
 * 실제 값은 outer[0]inner[0](예시임) 에 존재하게 댐
 * 
 */
import javax.swing.JOptionPane;
public class MultiArrEx {

   public static void main(String[] args) {
   
      
      //이차원 배열의 생성문법 1. 배열의 크기만 주고 생성, 값은 타입의 default 값으로 초기화 되어짐
      int[] multi1[] = new int[3][10];
      //아파트의 동수를 출력
      System.out.println(multi1.length);
      //0동애는 몇가구가 살고 있을 까요??
      System.out.println(multi1[0].length);
      //0번쟤 동에 9번째(마지막) 가구수
      System.out.println(multi1[0][9]);
      
      //배열의 요소에 값 대입하기
      multi1[0][9] = 100;

      System.out.println(multi1[0][9]); 
      
      //배열의 초기화식 문법(전에도 강의 햇지만, 뭔가를 초가화 한다는 말은 
      //선언과 동시에 값을 할당, 즉 초기화 한다는 말
      //배열 초기화란 배열을 생성하면서 default 값이 아닌 특정 값으로 초기화 한다는 말임
      String[] apt[] = {{"효정","낙주","희정"},{"혜원","상원","요한"}};   
      System.out.println(apt[0][apt[0].length-1]);
      
      //for 를 이용해서 모든 사람을 출력해보세요.(Tip,, 각 동에는 가구가 할당되어잇고, 그 길이를 리턴하는 length 속성이 존재)
      for(int i = 0; i<apt.length; i++) {
         for(int j=0; j < apt[i].length; j++) {
            System.out.println(apt[i][j]);
         }
      }
      
      //2번쨰 문법.. 위 1과 2를 합친문법
      char[] theCh[] = new char[][] {{'A','B'},{'C','D'},{'E','F'}};
      //for 를 이용해서 출력해보세요
      
      for(int i = 0; i < theCh.length; i++) {
         for(int j = 0,c = 'z'; j < theCh[i].length; j++,c--) {
            System.out.println(theCh[i][j]);
            //theCh[i][j] = (char)c;
         }
      }
      
      
      //3명의 성적을 관리하는 프로그램을 배열로 작성해봅니다.
      String[] sub = {"국어 점수 입력(0~100)","수학 점수 입력(0~100)","영어 점수 입력(1~100"};
      //한 명당 받을 수 잇는 과목수는 위 sub 가 가지고 잇음 또한, 총점도 각 인원에 맞게 설정되어야 합니다
      int[] scores[] = new int[3][4]; //3명에 4개의 점수(3개는 국영수 나머진 총점)를 담을 수 잇도록 다중 배열 생성
      float[] avgs = new float[scores.length];
      
      for(int i = 0; i < scores.length; i++) {//모든 사람의 점수를 입력받기 위해 사람 수 만큼 루프 시작
         //이 영역은 각 사람의 영역으로 들어왔다는 말임..
         for(int j = 0; j < sub.length; j++) { //scores[i].length -1 할 수도 잇음
            //이 영역은 i 번 학생의 j 점수를 입력받는 영역

            do {

                  scores[i][j] = Integer.parseInt(JOptionPane.showInputDialog(sub[j]));
            }   while(scores[i][j] > 100 || scores[i][j] < 0);
            //여기로 코드가 온다는 의미는 한 과목의 입력 점수가 올바르다는 뜻.
            scores[i][3] += scores[i][j];
         }
         //여기는 여전히 i 변수인 사람을 Ref 하는 영역임
         //즉 코드가 여기로 온다는 말은 점수가 모두 올바르고 총점까지 누적되엇다는 말임
         
         avgs[i] = (float)(scores[i][3] / 3.0); //이건  평균 코드
         
         
            
      }
      
      for(int i = 0; i < scores.length; i++) {
         if(i == 0) {
            System.out.println("첫 번째 총점 : " + scores[i][3] + "평균 :" + avgs[i]);
            
         }else if(i == 1) {
            System.out.println("두 번째 총점 : " + scores[i][3] + "평균 :" + avgs[i]);
         }else if(i == 2) {
            System.out.println("세 번째 총점 : " + scores[i][3] + "평균 :" + avgs[i]);
         }
      }
      
      
      
      
      //동적가변 배열 : 배열을 동적으로 생성하는 것.
      
      char[] stars[] = new char[10][];
      
      for(int i= 0; i < stars.length; i++) {
         
         stars[i] = new char[i+1]; //공백에 새로운 값 주기
         
         for(int j= 0; j < stars[i].length; j++) {
            stars[i][j] = '*';
            Systehttp://m.out.print(stars[i][j]);
         }
         
            System.out.println();
      }
      
      /*
 * Call by Reference : 메서드와 메서드간의 호출을 같이 넘겨지는 파라미터가 객체 타입인 경우
 * 발생하는 특징을 정리
 * 
 * 같은 객체 : 인스턴스를 참조하느 레퍼런스가 같은 객체
 */

import java.util.Arrays;

public class CallByReEx {

   public static void main(String[] args) {
      int[] arr = {1,2,3}; //String[] arr = null; 지금은 값이 없는 string 배열이지만 나중에 값이 할당될거야 라는 느낌
      //arr = null;
      b(arr);
      System.out.println("b() 에서 수정 후 a() 애서의 arr 배열의 값 :" + Arrays.toString(arr));
      //객체의 참조를 날려버리는 방법.. 
      //모든 객체의 기본값인 null 을 대입하면 더 이상 Ref 하지 않음................

   }
   static void b(int[] pArr) {
      System.out.println("파라미터로 받은 배열의 값 : " + Arrays.toString(pArr));
      //pArr 의 값 수정함
      pArr[0] = 1000;
      System.out.println("수정 후 배열의 값(b()) : " + Arrays.toString(pArr)) ; 
   }

}
      
      
/*
 * Java Class : 자바 객체지향(OOP - Object Oriented Programming )의 핵심
 * 
 * 
 * 클랙스는 객체의 원형(Prototype) 이라고 칭하며, 실제 프로그램이 실행이 될떄, 그 목적을 담은 클래스를 정의 후 
 * 해당 클래스의 객체(instance)를 생성하며, 이를 이용하는게 객체지향 프로그램이다
 * 
 * 때문에 객체는 그 원형인 클래스가 없이는 절대 생성이 불가하다는 의미로 생각
 * 
 * 이런 목적으로 클래스를 정의 하는데 클래스를 바탕으로 객체가 되엇을 떄 각 객체는 객체간의 통신을 메서드로 통해서
 * 하게 되며 주고 받는 데이터는 그 객체가 가지고 잇는 속성을 주고 받고 연산등을 통해 목적을 이루도록 합니다
 * 
 * 해서 클래스에는 위 목적에 맞게 설계를 위한 2개를 기본적으로 정의 하는데 속성 메서드임
 * 
 * 또한 클래스에는 실제 클레스를 바탕으로 인스턴스를 생성하게 해주는 역할을 하는 코드또한 넣을 수 있는데(optional)
 * 이를 객체를 생성하는 메서드라고 해서 일명 생성자(constructor) 라고 부름
 * 
 * 이 생성자가 반드시 존제해야만 클래스를 바탕으로 객체를 생성할 수 있슴니다.
 * 
 * 생성자가 하는 역할은 이것외에 객체가 생성시 객체의 상태를 특정 상태로 초기화 하는 기능도 내포하고 잇음
 * 
 * 다시 종합하면, 클래스는 객체의 바탕이며, 하나의 클래스를 바탕으로 원하는 만큼의 객체를 발생(instantiation)할 수 잇고 
 * 메서드를 통해 통신고ㅏ기능을 수행 하며 객체의 상태는 속성의 값으로 표현한다고 할 수 잇음
 * 
 * 마지막으로 클래스를 정의 할 떄 위 내용을 기반으로 3개를 정의 (모두 옵션임 목적에 따라 할 수도 안 할 수도 잇음)
 * 할 수 잇는데 그 종류는 아래와 같음
 * 
 * 1. 객체의 속성을 나타내는 필드(fields) : 자바에서는 이를 객체의 속성 이라고 해서 member field 라고 함
 * 2. 객체가 생성된 후 수행할 기능을 정의 한 메서드 ,, non-static 메서드여야 하며, 이를 member method 라고 함
 * 3.객체를 생성하고 초기화 하는 기능을 가진 일종의 메서드인 생성자 : 반드시 클래스 이름과 같아야 하며 리턴타입이 존재하지 않음
 * 
 * 일반적으로 클래스 정의 시  클래명 > 맴필 > 생성자 > 메서드 순으로 정의 됨
 */
public class ClassExam {

   public static void main(String[] args) {
   
     Avi6Student me = new Avi6Student();//Instantiation

     System.out.println(me.name);//default 객체 : 필드값이 디폴트값으로 초기화 된 거 기본 객체
     System.out.println(me.age);
     
     //멤필에 대한 대입
     
    me.name = "최주현";
    me.age = 27;
    me.addr = "서울";
    
    Avi6Student hyojung = new Avi6Student();
    

    
    
    
    
    
    
    
    
    
    
    
    
    
   }

}     
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
   }

}      
      
      
      
      
      
      
      
      
      
      
      
      
      

   }

}

'언어 > java' 카테고리의 다른 글

public  (0) 2024.02.16
상속  (0) 2024.02.12
Class  (0) 2024.02.12
제이쿼리  (0) 2024.01.28
화살표 함수  (0) 2024.01.28