1. 클래스와 인스턴스

                        인스턴스화
클래스     ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ>  인스턴스(객체)
인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.

                                                                Tv t = new Tv();   (Tv라는 클래스가 있다고 가정했을 때, 객체 생성 코드)
               
- t=인스턴스를 가리키는 참조변수(주소 저장)
- new연산자를 통해 객체 생성
- Tv()생성자를 통해 초기화
여러개의 참조변수가 하나의 객체를 가리킬수는 있지만,
하나의 참조변수가 여러개의 객체를 가리킬수는 없다.

 

2. 변수의 종류

변수의 종류 선언위치 생성시기
클래스 변수(cv) 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수(iv) 인스턴스가 생성되었을 때
지역변수(lv) 클래스 영역 이외의 영역
(매서드, 생성자, 초기화 블럭 내부)
변수 선언문이 수행되었을 때

- 클래스 변수: 클래스 내에서 한 메모리를 공유 (인스턴스 변수에 static 붙이면 클래스 변수)

- 인스턴스 변수: 인스턴스 각각의 개별 저장공간 사용

ㅡㅡ> 클래스 내에서 다같이 공유되는 속성은 클래스 변수 사용, 인스턴스 별로 개별적인 속성은 인스턴스 변수 사용.

ex. 트럼프 카드를 클래스로 설계한다면,

클래스 변수: 카드의 폭, 넓이

인스턴스 변수: 카드의 무늬, 숫자

인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.

 

3. 매서드

매서드 선언

선언부    반환타입 매서드이름 ( 타입 변수명,  타입 변수명,  ...... )

구현부    {              매서드 호출 시 수행될 코드                      }

매서드 호출

매서드이름( 값1, 값2, .......)

기타

main 매서드도 매서드다! ㅡ> main 매서드를 계속 class영역으로 인식하는 실수,,,,
매서드의 매개변수는 여러개일 수 있지만 반환값(return)은 반드시 한 개이다.
매서드 호출 시의 인자의 타입과 갯수와, 매서드 선언 시의 매개변수의 타입과 갯수가 일치해야 한다.
(최소한 자동형변환이 가능한 것이어야 한다.)
매개변수를 기본형으로 선언하면 값을 읽기만 가능, 매개변수를 참조형으로 선언하면 값이 저장된 곳의 주소를 알 수 있기 때문에 읽고 쓰기가 가능.
매개변수, 반환값 모두 참조형 가능.
참조형이라는 것은 매서드가 객체의 주소를 변수로 받고 반환한다는 의미이다.

재귀호출

- 매서드 내부에서 자신을 다시 호출.
- 기본적으로 반복의 형태를 가짐 ㅡ> if 문으로 조건 추가 필요
- 반복문보다 성능이 떨어지지만 보다 직관적으로 프로그래밍이 가능하다는 장점이 있음 ㅡ> 효율적이라도 알아보기 힘든 것보다 다소 비효율적이여도 알아보기 쉽게 작성하는 것이 논리적 오류가 적고 수정하기도 쉽다
-  재귀매서드가 잘못 코딩되면 무한 반복으로 스택오버플로우 오류 발생

클래스 매서드와 인스턴스 매서드

- iv를 사용하느냐 여부!

- 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 살펴보고 있으면, static을 붙여준다
- 작성한 매서드 중에서 인스턴스 변수나 인스턴스 매서드를 사용하지 않는 매서드에 static을 붙일 것을 고려한다. 
public class Ex6_19 {
    long a,b;    //인스턴스 변수(iv) 선언
    Ex6_19(){
        this.a=1;
        this.b=1;
    }

    long add(){return a+b;}  //인스턴스 매서드(im) 선언 - 인스턴스 변수 a,b 사용
    static long add2(long a, long b){return a+b;}  //클래스 매서드(cm) 선언 - 매개변수 사용

    public static void main(String[] args) {
        //System.out.println(add());        //클래스 매서드에서 인스턴스 매서드 호출 불가
        System.out.println(add2(1,2));   //같은 클래스 내에서는 Ex6_19.add() 이렇게 클래스명을 안 적어도 됨

        Ex6_19 t=new Ex6_19();
        System.out.println(t.add());        //객체 생성 후 인스턴스 매서드 호출 가능
    }
}
3
2

종료 코드 0(으)로 완료된 프로세스

클래스 멤버와 인스턴스 멤버간의 참조와 호출

public class Ex6_20 {
    int iv=10;                   //인스턴스 변수
    static int cv=20;            //static 변수(클래스 변수)

    int iv2=iv;                  //인스턴스 변수 -> 인스턴스 변수  :가능
    int iv3=cv;                  //인스턴스 변수 -> 클래스 변수    :가능
    //static int cv2=iv;         //static 변수  -> 인스턴스 변수  :불가능
    static int cv3=cv;           //static 변수  -> static 변수   : 가능

    void InstanceMethod(){
        System.out.println(iv);    //인스턴스 매서드 -> 인스턴스 변수  :가능
        System.out.println(cv);    //인스턴스 매서드 -> static 변수   :가능
    }
    
    static void staticMethod(){
        //System.out.println(iv);  //static 매서드  -> 인스턴스 변수  :불가능
        System.out.println(cv);    //static 매서드  -> static 변수   :가능
    }
    
    void InstanceMethod2(){
        InstanceMethod();          //인스턴스 매서드 -> 인스턴스 매서드 :가능
        staticMethod();            //인스턴스 매서드 -> static 매서드  :가능
    }
    
    static void staticMethod2(){
        //InstanceMethod();        //static 매서드  -> 인스턴스 매서드 :불가능
        staticMethod();            //static 매서드  -> static 매서드  :가능
    }
}
static 변수와 static 매서드에서는 인스턴스 변수와 인스턴스 매서드를 사용할 수 없다 

 

4. 오버로딩

1. 매서드 이름이 같아야 한다
2. 매개변수의 갯수나 타입이 달라야 한다
3. 반환타입은 관련이 없다
long add(int a, long b){return a+b;}
long add(long a, int b){return a+b;}

ㅡ> 둘 다 int, long 하나씩이지만 순서가 달라서 매서드 호출 시 매개변수의 값에 따라 구분이 가능하므로 오버로딩
가변인자를 사용한 매서드는 오버로딩 하면 매서드를 호출 했을 때, 구분하지 못하는 에러가 발생하기 쉽기 때문에 가능하면 오버로딩 하지 않는 것이 좋다

5. 생성자

생성자: 인스턴스 변수 초기화 매서드
 ㅡ>
인스턴스 변수 초기화, 인스턴스 생성 시 실행되어야 할 작업을 위해 사용
1. 생성자의 이름은 클래스의 이름과 같아야 한다
2. 생성자는 리턴 값이 없다 (리턴값이 없지만 void를 쓰지 않고 아무것도 적지 않는다)
생성자도 오버로딩이 가능하여 여러 생성자를 생성할 수 있다

생성자 내에서 다른 생성자를 호출할 때
1. 생성자의 이름으로 클래스 이름 대신 this를 사용한다
2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다

ex.
car(String color, String type, int door){
    this.color=color;
    this.type=type;
    this.door=door;
}

car(String color){    
    this(color, "auto", 4);    //위의 생성자를 호출해서 color만 입력 받은 값으로 하고 나머지는 auto, 4로 초기화
}
this     인스턴스 자신을 가리키는 참조변수로, 모든 인스턴스매서드에 지역변수로 숨겨진 채로 존재한다
           지역변수와 인스턴스변수를 구분하는데 사용한다
this()   생성자로, 같은 클래스의 다른 생성자를 호출할 때 사용한다
인스턴스 생성 시 고려사항
1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?

 

6. 변수의 초기화

클래스변수, 인스턴스변수의 초기화는 선택
지역변수는 초기화 필수

멤버변수들의 초기화블럭, 생성자 사용 시 실행 확인

public class Ex6_27 {
    static{
        System.out.println("static 초기화 블럭");
    }
    {
        System.out.println("인스턴스 초기화 블럭");
    }
    public Ex6_27(){
        System.out.println("생성자");
    }

    public static void main(String[] args) {
        System.out.println("메인에서 객체 ex생성");
        Ex6_27 ex=new Ex6_27();
        System.out.println("메인에서 객체 ex2생성");
        Ex6_27 ex2=new Ex6_27();
    }
}
static 초기화 블럭
메인에서 객체 ex생성
인스턴스 초기화 블럭
생성자
메인에서 객체 ex2생성
인스턴스 초기화 블럭
생성자

종료 코드 0(으)로 완료된 프로세스

위의 코드의 실행 결과로 아래 2가지를 알 수 있다

1. static 초기화 블럭은 main보다 먼저 실행되고 한 번만 실행된다

2. 인스턴스 초기화 블럭과 생성자는 객체 생성시마다 초기화되며 초기화블럭이 먼저 실행되고 생성자가 실행된다

초기화블럭을 이용한 초기화 예제 - 제품을 생산할 때마다 갯수를 늘리고 갯수를 제품번호로 저장

class Product{
    static int count=0;
    int serialNo;
    {
        ++count;
        serialNo=count;     //객체(제품)가 생성될 때마다 count를 증가하고 제품번호를 저장한다
    }
}
public class Ex6_29 {
    public static void main(String[] args) {
        Product p1=new Product();
        Product p2=new Product();
        Product p3=new Product();

        System.out.println("p1의 serialNo은: "+p1.serialNo);
        System.out.println("p1의 serialNo은: "+p2.serialNo);
        System.out.println("p1의 serialNo은: "+p3.serialNo);
        System.out.println("생성된 제품의 갯수는: "+Product.count);
    }
}
p1의 serialNo은: 1
p1의 serialNo은: 2
p1의 serialNo은: 3
생성된 제품의 갯수는: 3

종료 코드 0(으)로 완료된 프로세스

- product 클래스의 count 변수가 iv 였다면 객체가 생성될 때마다 새로 만들어져서 항상 1을 갖게 된다

생성자를 이용한 초기화 예제 - 문서 생성

class document{
    static int count=0;
    String title;

    document(){
        this("제목없음"+ ++count);
    }

    document(String title){
        this.title=title;
        System.out.printf("문서 [%s]가 생성되었습니다.%n",title);
    }
}
public class Ex6_30 {
    public static void main(String[] args) {
        document d1=new document("문서1번");
        document d2=new document();
        document d3=new document();
        document d4=new document("생성자로 초기화");
        document d5=new document();
    }
}
문서 [문서1번]가 생성되었습니다.
문서 [제목없음1]가 생성되었습니다.
문서 [제목없음2]가 생성되었습니다.
문서 [생성자로 초기화]가 생성되었습니다.
문서 [제목없음3]가 생성되었습니다.

종료 코드 0(으)로 완료된 프로세스

 

 

 

'Study > Java' 카테고리의 다른 글

[개념]배열의 다양한 활용(예제 5가지)  (1) 2025.06.23
[개념]연산자2  (1) 2025.06.18
[개념]JVM이 사용하는 메모리 영역  (0) 2025.06.15
[개념]Static, NoneStatic  (1) 2025.06.15
[개념]매서드(Method)  (0) 2025.06.02

1. 총합과 평균

import java.util.Scanner;

//총점, 평균 구하기
public class Ex5_5 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int sum=0;
        float average=0;
        //점수 갯수 입력 받기
        System.out.print("총점과 평균을 계산할 점수의 갯수를 입력하세요(0~20억)> ");
        String counts=scanner.nextLine();
        int count=Integer.parseInt(counts);

        //점수값들 입력받기
        int[]score=new int[count];
        for(int i=0;i<score.length;i++){
            System.out.printf("계산할 점수를 입력하세요(정수)[%d]> ",i+1);
            String num=scanner.nextLine();
            score[i]=Integer.parseInt(num);
        }

        //총점과 평균 계산
        for(int i=0;i<score.length;i++){
            sum+=score[i];
        }
        average=(float)sum/score.length;    //정확한 평균 계산을 위해 float 형변환 주의!
        System.out.println("총점: "+sum);
        System.out.println("평균: "+average);
    }
}
총점과 평균을 계산할 점수의 갯수를 입력하세요(0~20억)> 5
계산할 점수를 입력하세요(정수)[1]> 75
계산할 점수를 입력하세요(정수)[2]> 80
계산할 점수를 입력하세요(정수)[3]> 96
계산할 점수를 입력하세요(정수)[4]> 58
계산할 점수를 입력하세요(정수)[5]> 88
총점: 397
평균: 79.4

종료 코드 0(으)로 완료된 프로세스

- 평균 구할 때, float 형으로 형변환 하는 것 주의

2. 최대값, 최소값 구하기

import java.util.Scanner;

//최대값 최소값 구하기
public class Ex5_6 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int sum=0;
        float average=0;
        //점수 갯수 입력 받기
        System.out.print("최대값과 최소값을 계산할 점수의 갯수를 입력하세요(0~20억)> ");
        String counts=scanner.nextLine();
        int count=Integer.parseInt(counts);

        //점수값들 입력받기
        int[]score=new int[count];
        for(int i=0;i<score.length;i++){
            System.out.printf("숫자들을 입력하세요(정수)[%d]> ",i+1);
            String num=scanner.nextLine();
            score[i]=Integer.parseInt(num);
        }

        //최대값 최소값 계산
        int max=score[0], min=score[0];
        for(int i=0;i<score.length;i++){
            if(score[i]>max){
                max=score[i];
            } else if (score[i]<min) {
                min=score[i];
            }
        }
        System.out.println("최대값: "+max);
        System.out.println("최소값: "+min);
    }
}
최대값과 최소값을 계산할 점수의 갯수를 입력하세요(0~20억)> 7
숫자들을 입력하세요(정수)[1]> 134
숫자들을 입력하세요(정수)[2]> 15
숫자들을 입력하세요(정수)[3]> 24
숫자들을 입력하세요(정수)[4]> 56
숫자들을 입력하세요(정수)[5]> 2456
숫자들을 입력하세요(정수)[6]> 456
숫자들을 입력하세요(정수)[7]> 34
최대값: 2456
최소값: 15

종료 코드 0(으)로 완료된 프로세스

- 최대값과 최소값을 계산하기 위한 별도의 변수 선언해서 배열의 값들과 순서대로 비교하면서 최대값과 최소값을 찾는 개념

3. 섞기

3-1. 배열의 첫번째 값과 무작위 순서 값을 섞기

import java.util.Arrays;

//랜덤으로 섞기
public class Ex5_7 {
    public static void main(String[] args) {
        //0~9까지 배열 생성
        int[]arr={0,1,2,3,4,5,6,7,8,9};
        int trynum=100;
        System.out.println("arr="+ Arrays.toString(arr));

        //0~9까지 임의의 수 생성해서 arr[0]번째와 n번째 수를 trynum만큼 계속 섞기
        for(int i=0;i<trynum;i++){
            int n=(int)(Math.random()*10);
            int tmp=arr[0];
            arr[0]=arr[n];
            arr[n]=tmp;
        }

        System.out.println("arr="+ Arrays.toString(arr));
    }
}
arr=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
arr=[2, 4, 6, 7, 8, 1, 9, 5, 3, 0]

종료 코드 0(으)로 완료된 프로세스

- 첫번째 값과 무작위 번째 값의 자리를 바꾸기 위해 tmp라는 새로운 변수 필요(두 변수 자리 바꿀 때와 같은 개념)

3-2. 로또번호 추첨

//로또번호 만들기
public class Ex5_8 {
    public static void main(String[] args) {
        //1~45번호가 있는 배열 만들기
        int[]arr=new int[45];
        for(int i=0;i<arr.length;i++){
            arr[i]=i+1;
        }

        //배열을 무작위로 섞고 무작위로 6개 뽑기
        int j=0;  //무작위 수 저장
        int tmp=0;   //자리바꿀 때 임시변수
        int trynum=100;  //섞을 횟수

        for(int i=0;i<trynum;i++){
            j=(int)((Math.random()*44)+1); //0~44 중 무작위 수 생성
            //arr[0]와 arr[j] 자리 바꾸기
            tmp=arr[0];
            arr[0]=arr[j];
            arr[j]=tmp;
        }
        
        for(int i=0;i<6;i++){
            System.out.printf("%d번 공=%d%n",i+1,arr[i]);
        }
    }
}
1번 공=7
2번 공=33
3번 공=6
4번 공=44
5번 공=34
6번 공=36

종료 코드 0(으)로 완료된 프로세스

- 1~45중 무작위로 순서를 섞어서 앞에 6개만 뽑아오겠다는 건데 그냥 랜덤으로 번호를 뽑을거라면

for(int i=0;i<6;i++){
            j=(int)((Math.random()*44)+1); //0~44 중 무작위 수 생성
            System.out.printf("%d번 공=%d%n",i+1,arr[j]);
        }

- 그냥 이렇게 1~45중 무작위로 위치한 공을 뽑으면 될 듯

(섞는거 연습해야 해서 억지로 섞고 앞에 6개만 뽑는 예제인 것 같다는 생각)

4. 정렬

import java.util.Arrays;

//정렬하기 (버블정렬)
public class Ex5_10 {
    public static void main(String[] args) {
        //0~9까지 랜덤으로 10개를 가지는 배열 생성 후 초기화
        int[]arr=new int[10];
        for(int i=0;i<arr.length;i++){
            arr[i]=(int)(Math.random()*10);
        }
        System.out.println(Arrays.toString(arr));

        //정렬하기
        for(int i=0;i<arr.length-1;i++){
            boolean changed=false; //자리변경 여부 확인
            for(int j=0;j<arr.length-1-i;j++){
                //왼쪽 숫자가 오른쪽보다 크면 자리 바꿈
                if(arr[j]>arr[j+1]){
                    int tmp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=tmp;
                    changed=true;
                }
            }
            if(!changed){break;}  //더이상 자리바꿈이 없으면 정렬 멈춤
            System.out.println(Arrays.toString(arr));
        }
    }
}
[5, 3, 5, 9, 6, 3, 6, 1, 8, 3]
[3, 5, 5, 6, 3, 6, 1, 8, 3, 9]
[3, 5, 5, 3, 6, 1, 6, 3, 8, 9]
[3, 5, 3, 5, 1, 6, 3, 6, 8, 9]
[3, 3, 5, 1, 5, 3, 6, 6, 8, 9]
[3, 3, 1, 5, 3, 5, 6, 6, 8, 9]
[3, 1, 3, 3, 5, 5, 6, 6, 8, 9]
[1, 3, 3, 3, 5, 5, 6, 6, 8, 9]

종료 코드 0(으)로 완료된 프로세스

- 처음부터 순서대로 바로 뒤에 숫자와 비교해서 크면 뒤로 옮겨가는 방식(버블정렬)

- 간단하지만 비효율적 (배열의 길이가 n일 때, n-1번의 비교를 점점 하나씩 줄여가면서 n번 실행해야 함)

 

5. 빈도수 구하기

import java.util.Arrays;

//빈도 구하기
public class Ex5_11 {
    public static void main(String[] args) {
        int[]arr=new int[10];
        int[]counter=new int[arr.length];

        //arr에 0~9까지 임의의 수 10개 초기화
        for(int i=0;i<arr.length;i++){
            arr[i]=(int)(Math.random()*10);
        }
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));

        //임의로 생성된 배열값을 확인해서 counter 배열을 이용해 갯수 세기
        for(int i=0;i<arr.length;i++){
            counter[arr[i]]++;
        }

        //결과 출력
        for(int i=0;i<arr.length;i++){
            System.out.printf("%d의 개수:%d%n",i,counter[i]);
        }
    }
}
[1, 1, 2, 2, 3, 5, 6, 7, 7, 9]
0의 개수:0
1의 개수:2
2의 개수:2
3의 개수:1
4의 개수:0
5의 개수:1
6의 개수:1
7의 개수:2
8의 개수:0
9의 개수:1

종료 코드 0(으)로 완료된 프로세스

- 배열과 동일한 길이의 counter 배열 생성 후 각 위치에 해당하는 숫자를 세는 방법

- counter[arr[i]]++;  이 코드가 핵심

 

*위의 예제는 배열이 정수라서 가능한 건데 그럼 char 형이나 String인 경우에는 어떻게 빈도수를 구하지?! 하는 물음이 들어서 고미하다가 지피티씨한테 물어봤으나 hashset 이나 indexof 같은 아직 공부 안한게 나와서 다음 기회에....

라고 생각했으나...

이해는 못해도 구현은 할 수있는게(?) AI시대의 개발자의 모습 아닌가....?

고유값을 가지는 배열을 생성하는 부분만 지피티씨의 친절한 도움과 함께 코드 완성

//숫자가 아닌 char형이나 String인 배령인 경우에는 빈도수를 어떻게 세지???
//1. 고유값만을 가지는 배열을 만들고 2. 원래 배열과 새로운 배열을 비교해서 개수를 세서 counter배열(새로운 배열과 같은 길이)에 저장해서 출력
public class Ex5_11_3 {
    public static void main(String[] args) {
        char[]arr={'a','b','c','d','e','b','c','e','b','c'};
        for(int i=0;i<arr.length;i++){
            System.out.printf("%c,",arr[i]);
        }
        System.out.println();
        
        //고유값을 가지는 uniqueArr배열 만들기
        String unique="";
        for(char c:arr){
            if(unique.indexOf(c)==-1){
                unique+=c;
            }
        }
        char[]uniqueArr=unique.toCharArray();
        
        int[]counter=new int[uniqueArr.length];

        //arr배열과 uniqueArr배열을 비교해서 counter 배열에 숫자 세기
        for(int i=0;i<uniqueArr.length;i++){
            for(int j=0;j<arr.length;j++)
                if(uniqueArr[i]==arr[j]){
                    counter[i]++;
            }
        }

        //결과 출력
        for(int i=0;i<uniqueArr.length;i++){
            System.out.printf("%c의 개수:%d%n",uniqueArr[i],counter[i]);
        }
    }
}
a,b,c,d,e,b,c,e,b,c,
a의 개수:1
b의 개수:3
c의 개수:3
d의 개수:1
e의 개수:2

종료 코드 0(으)로 완료된 프로세스

- char 형

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;

//숫자가 아닌 char형이나 String인 배령인 경우에는 빈도수를 어떻게 세지???
//1. 고유값만을 가지는 배열을 만들고 2. 원래 배열과 새로운 배열을 비교해서 개수를 세서 counter배열(새로운 배열과 같은 길이)에 저장해서 출력
public class Ex5_11_3 {
    public static void main(String[] args) {
        String[]arr={"hi","Hi","hi","HI","hi","hi","HI","hI","hI","hI"};
        for(String str:arr){System.out.printf("%s,",str);}
        System.out.println();

        //고유값을 가지는 uniqueArr배열 만들기
        // 중복 제거 및 순서 유지
        Set<String> set = new LinkedHashSet<>(Arrays.asList(arr));
        // Set → 새로운 배열
        String[] uniqueArr = set.toArray(new String[0]);
        // 출력
        System.out.println("고유값 배열: " + Arrays.toString(uniqueArr));

        //arr배열과 uniqueArr배열을 비교해서 counter 배열에 숫자 세기
        int[]counter=new int[uniqueArr.length];

        for(int i=0;i<uniqueArr.length;i++){
            for(int j=0;j<arr.length;j++)
                if(uniqueArr[i].equals(arr[j])){
                    counter[i]++;
            }
        }

        //결과 출력
        for(int i=0;i<uniqueArr.length;i++){
            System.out.printf("%s의 개수:%d%n",uniqueArr[i],counter[i]);
        }
    }
}
hi,Hi,hi,HI,hi,hi,HI,hI,hI,hI,
고유값 배열: [hi, Hi, HI, hI]
hi의 개수:4
Hi의 개수:1
HI의 개수:2
hI의 개수:3

종료 코드 0(으)로 완료된 프로세스

- String 형

'Study > Java' 카테고리의 다른 글

[개념]객체 지향 프로그래밍1  (2) 2025.06.26
[개념]연산자2  (1) 2025.06.18
[개념]JVM이 사용하는 메모리 영역  (0) 2025.06.15
[개념]Static, NoneStatic  (1) 2025.06.15
[개념]매서드(Method)  (0) 2025.06.02
public static void main(String[] args) {
        // i++ 과 ++i의 차이
        int i=3, j=5;
        System.out.println(j+ i++);
        System.out.println(i);
        System.out.println(j+ ++i);

        //정수형 1234는 float형 보다 작아서 자동형변환 가능
        float f=1234;
        System.out.println(f);

        //char형은 거의 int형과 함께 생각
        System.out.println((int)'가');
        System.out.println((int)'다');
        System.out.println('다'-'가');

        //int 형의 범위를 넘어가서 a*b는 오버플로우 발생 -> long형으로 형변환 필요
        int a=1_000_000;
        int b=2_000_000;
        System.out.println(a*b);
        System.out.println((long)a*b);

        //Math.round(): 실수를 소수 첫번째 자리에서 반올림해서 정수 반환
        double pi=3.141592;
        System.out.println(Math.round(pi*1000)/1000.0); //3.142
        System.out.println((int)(pi*1000)/1000.0); //3.141

        //문자열 비교   -> 문자열 비교 시에는 == 연산자 보다는 equals()매서드 사용
        String str1="abc";
        String str2="abc";
        String str3=new String("abc");
        String str4=new String("abc");
        System.out.println(str1==str2);  //True
        System.out.println(str1.equals(str2));  //True
        System.out.println(str3==str4);  //False
        System.out.println(str3.equals(str4));  //True

        //논리 연산자 &&, ||
        int num=24;
        System.out.println(num%2==0 || num%3==0); //True //num은 2의 배수이거나 3의 배수이다
        System.out.println(num%7==0 || num%3==0 && num%6!=0);  //False  //num은 7의 배수이거나 3의배수이면서 6의 배수가 아니다.  //&&연산자가 ||보다 우선한다
        System.out.println('0'<='5' && '5'<='9');  //True //임의의 문자('5')는 숫자0~9 사이에 있다
        System.out.println('a'<='h' && 'h'<='z');  //True //'h'가 소문자인지 확인
        System.out.println(!('a'<='h' && 'h'<='z')); //False //'h'가 소문자가 아니다

        //조건연산자 ? :
        System.out.println(3>5?3:5); //5 //참이면 3, 거짓이면 5
    }
}
8
4
10
1234.0
44032
45796
1764
-1454759936
2000000000000
3.142
3.141
true
true
false
true
true
false
true
true
false
5

종료 코드 0(으)로 완료된 프로세스

'Study > Java' 카테고리의 다른 글

[개념]객체 지향 프로그래밍1  (2) 2025.06.26
[개념]배열의 다양한 활용(예제 5가지)  (1) 2025.06.23
[개념]JVM이 사용하는 메모리 영역  (0) 2025.06.15
[개념]Static, NoneStatic  (1) 2025.06.15
[개념]매서드(Method)  (0) 2025.06.02
Method Area Heap Area Generation
매서드의 바이트코드(기계어코드)가 할당되는 공간

Static-zone 과 none-static-zone 으로 나누어진다.

static 멤버들은 static-zone에 할당된다.
객체가 생성되는 메모리 공간(new 연산자)

GC(garbage collector)에 의해서 메모리가 수집된다.
Stack Area
(Call Stack Frame Area)

PC register
Native Method Area
(Literal Pool)
매서드가 호출되면 매서드의 기계어코드를 할당 받고(Native Method Aarea) 매서드가 실행 되는 메모리공간 (Call Stack Frame Area)
(지역변수, 매개변수들이 만들어지는 공간)

PC(Program Counter)에 의해서 현재 실행 중인 프로그램의 위치가 관리된다.

LIFO구조로 운영되 되는 메모리공간(매서드의 호출 순서를 알 수 있다)
상수 값 할당이 되는 메모리 공간

문자열 중 문자열 상수(Literal)가 할당 되는 메모리 공간

 

'Study > Java' 카테고리의 다른 글

[개념]배열의 다양한 활용(예제 5가지)  (1) 2025.06.23
[개념]연산자2  (1) 2025.06.18
[개념]Static, NoneStatic  (1) 2025.06.15
[개념]매서드(Method)  (0) 2025.06.02
[개념] for문과 while문  (4) 2025.05.30

1. Static 으로 매서드를 만든 경우

public class MyUtil {
    public static int hap(int a, int b){
        int v=a+b;
        return v;
    }
}

2. NoneStatic 으로 매서드를 만든 경우

public class MyUtil1 {
    public int hap(int a, int b){
        int v=a+b;
        return v;
    }
}

호출해서 사용할 때의 차이

public class StaticAccess {
    public static void main(String[] args) {
        int a=10;
        int b=20;

//Static
        int sum=MyUtil.hap(a,b);    //클래스이름.호출매서드
        System.out.println("sum = " + sum);


//NoneStatic
        MyUtil1 my=new MyUtil1();     //객체 생성
        int sum1= my.hap1(a,b);         //생성한 객체.호출매서드
        System.out.println("sum1 = " + sum);
    }
}
sum = 30
sum1 = 30

종료 코드 0(으)로 완료된 프로세스

*생성자는 반드시 public 이다? -> X

Static으로 생성한 매서드도 객체를 생성하는 방법으로 호출해서 사용할 수 있는데 바람직하지 않음.

private 생성자를 추가해서 객체를 생성할 수 없도록 할 수 있음.

자바에서 제공하는 system, math 클래스도 private 생성자를 가지고 있어서  System s=new System(); 식으로 사용할 수 없다.

public class AllStatic {
    private AllStatic(){}   //private 생성자 추가
    public static int hap(int a, int b){
        int v=a+b;
        return v;
    }

 

 

 

 

'Study > Java' 카테고리의 다른 글

[개념]연산자2  (1) 2025.06.18
[개념]JVM이 사용하는 메모리 영역  (0) 2025.06.15
[개념]매서드(Method)  (0) 2025.06.02
[개념] for문과 while문  (4) 2025.05.30
[개념]If문과 Switch-case문  (0) 2025.05.30

1. 매서드의 정의

접근제한자 리턴타입 메서드명(인수1, 인수2, ...){
        수행코드;
        return 반환값;
}

* return값이 없는 경우에는 리턴타입이 void

* 매개변수는 ',' 로 구분, 매개변수가 없더라도 괄호 ( ) 필요

 

2. 매서드 호출

자료형 변수명 = 매서드명(인수1, 인수2, ...)

*호출시 인수의 개수와 타입이 일치해야 함

*매서드의 결과는 하나의 값으로 나오기 때문에 하나의 변수로 받아줘야 함

public class MethodMakeTest{
    public static void main(String[] args) {
        int a=3;
        int b=5;
        int result=add(a,b); //매서드 호출
        System.out.println("result = " + result);
    }
    
    //매서드 정의
    public static int add(int a, int b){
        int sum=a+b;
        return sum;
    }
}
result = 8

종료 코드 0(으)로 완료된 프로세스

 

3. 매개변수 전달기법

1. Call by Value(값 전달)

public int add(int a, int b){
    int sum = a+b;
    return sum;
}

2. Call by Reference(번지 전달)

public int add(int[ ] a){
    int sum=0;
    for(int i=0;i<a.length;i++){
      sum+=a[i];
  }
  return sum;
}

*예시(배열 a를 모두 더하는 매서드를 정의하여 사용하기)

public class CallByReference {
    public static void main(String[] args) {
        int []a={1,2,3,4,5};
        int result=ArrayAdd(a);
        System.out.println("result = " + result);
    }
    public static int ArrayAdd(int[] a){
        int sum=0;
        for(int i=0;i<a.length;i++){
            sum+=a[i];
        }
        return sum;
    }
}
result = 15

종료 코드 0(으)로 완료된 프로세스

 

4. 매서드의 오버로딩(Overloading)

- 오버로딩: 하나의 클래스 내에서 동일한 이름의 매서드를 여러 개 사용할 수 있는 기법

- 오버로딩 전제조건: 매서드의 시그니처(매개변수 개수, 타입)가 달라야 함

*예시(정수, 실수를 받아서 총합을 구하는 매서드 정의하고 호출하여 사용하기)

public class OverloadingTest {
    public static void main(String[] args) {
        float v=Add(12.1f, 45.4f);
        System.out.println("v = " + v);
        int vv=Add(10,80);
        System.out.println("vv = " + vv);
    }
    public static int Add(int a, int b){
        int sum=a+b;
        return sum;
    }
    public static float Add(float a, float b){
        float sum=a+b;
        return sum;
    }
}
v = 57.5
vv = 90

종료 코드 0(으)로 완료된 프로세스

 

 

 

 

'Study > Java' 카테고리의 다른 글

[개념]JVM이 사용하는 메모리 영역  (0) 2025.06.15
[개념]Static, NoneStatic  (1) 2025.06.15
[개념] for문과 while문  (4) 2025.05.30
[개념]If문과 Switch-case문  (0) 2025.05.30
[개념]키보드로부터 데이터 입력 받기  (1) 2025.05.29

+ Recent posts