본문 바로가기
백엔드/자바

자바-4

by study_yeon 2023. 5. 1.

2023.05.01

1교시

* method(메소드) = 기능

- 동작을 처리는 함수

- 정적인 데이터를 동적으로 바꿔 줌

- 결과 등의 값을 도출해내는 흐름

* 데이터 = 변수 또는 상수의 형태

* 자바의 단점 : 개발자가 연산자를 지정할 수 없음
-> 메소드의 형식을 띄어야 함

● 계산하기


1. 프로젝트 만들기 
2023.05.01

2. 클래스와 패키지 동시에 만들기

- 패키지(관련있는 하나의 그룹)
-> clac(소문자)
- 클래스(실제 기능을 담당하는 부분) - 사용자 데이터형 
-> ClacEx(대문자)

3. 코드 적기 전 이론

* 메인함수(손코딩 연습)
- 특별한 메소드
- 프로그램의 시작 점 - 어디든 올 수 있음 (main 클래스부터 프로그 시작)
- 실제 현상이 벌어지는 곳-무대(stage) 클래스

* 데이터 함수

- class 함수
- 배우 클래스

* 자바는 결과를 리턴함 
- 데이터형에 맞게 
- 사용자가 정의해서 사용하지 못함(연산자 오버로딩 제공x)

* 메소드 정의(선언부)
public static int add(int x, int y) {  
    return x + y;   
}

 

* add(int x, int y)
함수이름(입력매개변수)
 ->  연산자 + 데이터

 

* 매개변수

- 둘 사이에서 양편의 관계를 맺어주면서, 어떤 관계나 범위 안에서 여러가지 값으로 변할 수 있는 가변적 요소


* public static
누구나 이용 가능하며 프로그램이 실행 될때 바로 등록해서 시작(바로 호출)

* static 
실행될 때 한 번 만들어진다

● 두 개의 정수를 사칙연산하여 출력하는 JavaSE 프로그램 만들기

package clac;

public class ClacEx {

	public static void main(String[] agrs) {
		int x = 100;  // 변수 선언
		int y = 50;
		int result;
		
		result = add(x, y);  // 메소드 호출(실행)
		System.out.printf("%d + %d = %d", x, y, result );  // %d : 포멧명세자( d = 10진법)
		display(result);
		
		result = sub(x, y);
		System.out.printf("%d - %d = %d", x, y, result );
		display(result);
		
		result = mul(x, y);
		System.out.printf("%d * %d = %d", x, y, result );
		display(result);
		
		result = div(x, y); 
		System.out.printf("%d / %d = %d", x, y, result );
		display(result);
	}
    
	 // 메소드 정의(선언)
	public static int add(int x, int y) { 
		return x + y;
	}
	public static int sub(int x, int y) {
		return x - y;
	}
	public static int mul(int x, int y) {
		return x * y;
	}
	public static int div(int x, int y) {
		return x / y;
	}
	public static void display(int iResult) {
		System.out.println("result = " + iResult);
	}
	
}

출력 결과


* 데이터 함수 부분에 메소드 정의(선언)
public static int add(int x, int y) {     
    return x + y;       //  add 메소드를 호출하면 x + y가 적용 됨
}
-> 정의는 메인함수 밖에다 써야함 - class 부분 (메인과 같은 레벨이기 때문에)


* 메인(stage) 함수 부분에 메소드 호출(실행)
result = add(x, y);

-> add를 호출하면 메인 밖에 있는 정의된 것이 사용 됨


2교시

* 결과를 보고싶으면 어딘가에 저장해야함 
-> result 함수 이용
int result;    // 변수 선언
result = add(x, y);   // 메소드 호출

* 출력하는 메소드 : display
- 데이터를 넘김 : 입력 값을 받겠다
- public static 사용 

* Run as

자바어플리케이션 - 단독으로 실행
스프링부트어플리케이션 - 서버에서 실행 

* 객체지향언어 - 참조 타입
- 번지를 참조한다(번지 - 데이터를 저장하는 공간) ; 방으로 표현하기도 함

ex) String name = "홍길동";

-> name이라는 변수를 100번지에 저장하겠다

* 기본타입 
- 데이터를 바로 집어넣음(저장하지 않음)
- 정수, 실수, 문자,  논리 리터럴을 저장하는 타입

ex) int age= 25;


* JVM 스택영역
- 데이터 처리가 이뤄짐

- 메소드를 호출할 때마다 프레임을 추가하고 메소드가 종료되면 해당프레임을 제거

 

* 스택영역의 힙 영역

- 스택영역

name 100번지

- 힙 영역(100번지를 참조)

100번지 홍길동


* 예시(부엌)
재료를 쌓는 곳(냉장고) - 힙
조리도구 - 메소드
작업대 - 스택(먼저 들어간 데이터가 제일 마지막에 처리 됨)


3교시

 

* 코딩한다

- 저장 : Clac.java

- 문법오류체크 : 컴파일러(해석기-javac.exe) 필요 - JDK

- 만들어지는 파일 : Clac.class

- 실행 : 실행해주는 명령어(java.exe) 및 프로세서(JVM) 필요  - JDK[JRE(JVM)]

 

* JVM (Java Virtual Machine) 이란?
- java 의 큰 특징은 플랫폼(OS) 독립적인 개발이 가능하다는 것

- 자동으로 메모리를 관리해줌 

 

* 자바의 구동 방식
한 줄 한 줄 실행하는 방식 인터프리터(interprete)
주로 자바스크립트 같은 곳에서 실행하는 방식

Run(실행)하는 순간(=java.exe) JVM이 동작을 한다


C:\app\java\2023.05.01\bin\clac
->실행파일은 패키지명 아래 bin 아래에 있음
자바가상머신(jre)에서 자바가 실행 됨

● 용어정리
1. 자바에서 컴파일 명령어와 실행명령어
javac 컴파일 명령어
java 실행명령어
javac.exe -> c(complie)


2. 객체지향 프로그래밍 언어란?
참조자료형, 클래스 단위로 프로그래밍 하는 것

3. javaSE 프로그램의 기본 틀을 작성하세요(Hello라는 메인 클래스 만들 것)
클래스명 헬로 생성
메인함수 작성

4. 객체지향 프로그램에서 클래스 안에서 특정 기능(동작)을 처리하는 함수를 무엇이라고 하는가
메서드

5. javaSE 프로그램에서 프로그램의 진입 점(시작 점)이며 가장 먼저 실행되는 메서드의 이름은
메인

6. JVM(Java Virtual Machine)이란 무엇인가
자바가상머신
자바 바이트코드를 실행시켜주는 런 타임


4교시

* 참조는 크기와 위치가 같아야 같은 것
-> 크기만 같은 경우가 있음 

* 주소가 같다면 동일한 객체를 참조하는 것

 

● 총점과 평균 구하기

public class Operator {

	public static void main(String[] args) { 
		int kor;  // 변수 선언
		int eng;
		int total;
		int avg;
		
		kor = 77;  // 초기화 
		eng = 87;
		total = kor + eng;
		avg = total / 2;
		
		System.out.printf("출력결과   총점:%3d\n",total);  // 오른쪽 정렬
		System.out.printf("           평균:%-3d\n",avg );  // 왼쪽 정렬
		
		Integer i = null;
		System.out.println("정수객체 i =" + i);
		
        // NullPointerException 발생시키기
		int[] intArray = null;  // 모여있는 정수형 변수들이 없음
		intArray[0] = 10;  // 0번째 요소가 없음 - 에러(가르킬 수 없음)
	}
		
}

결과 값

int[] intArray = null;   // 모여있는 정수형 변수들이 없음(주소가 성립이 안 됨)
intArray[0] = 10;       // 0번째 요소가 없음 - 에러(가르킬 수 없음)

int = 4칸 
배열은 연속으로 데이터를 할당


* null : 가르키는 객체가 없음
자바는 변수를 선언하면 사용하지 않음 상태로 세팅(기본 값)
-> null 값은 가비지콜렉터에 의해 정리 되기도 함

* NullPointerException
- null인 변수에 접근 시도하면 오류
- 논리실행오류


* null 과 undefined의 차이(자바스크립트)
null : 실체는 있는데 더 이상 사용하지 않는다. 임대 종료(비어있음)
undefined : 데이터를 사용하지 않음, 정의 되어있지 않다. 아직 계약이 안 됨(메모리 차지)

-> 초기화 하지 않은 변수



* 오류  
컴파일에러, 익셉션예외

* 객체 
- 서로간의 독립된 것
- 힙에 저장하는 것 
- 메모리에 실존한다

● new 연산자를 사용하여 String을 객체로 생성하기

1. class StringEx  만들기

public class StringEx {

	public static void main(String[] args) {
		String strVal1 = "서울";  // 변수 선언
		String strVal2 = "서울";
		
		// strVal1 과 strVal2의 주소가 같은가 (리터럴)
		if (strVal1 == strVal2) {
			System.out.println("strVal1 == strVal2 참조가 같음");
		} else {
			System.out.println("strVal1 != strVal2 참조가 다름");
		}
		
		// 변수 안의 값만 비교 equals
		if (strVal1.equals(strVal2)) {
			System.out.println("strVal1 문자열과 strVal2 문자열 같음");
		} else {
			System.out.println("strVal1 문자열과 strVal2 문자열 다름");
		}
		
		// 스트링을 객체로 생성해서 비교하기
		String strVal3 = new String("서울");
		String strVal4 = new String("서울");  //새로운 메모리 공간을 할당 
		
		// strVal3 과 strVal4가 같은가 (메모리가 할당된 위치(주소)가 같은가 다른가)
		if (strVal3 == strVal4) {
			System.out.println("strVal3 == strVal4 참조가 같음");
		} else {
			// strVal1 != strVal2
			System.out.println("strVal3 != strVal4 참조가 다름");
		}
		
		//참조변수의 값만 비교 equals  (문자열이 같은가 다른가)
		if (strVal3.equals(strVal4)) {
			System.out.println("strVal3 문자열과 strVal4 문자열 같음");
		} else {
			System.out.println("strVal3 문자열과 strVal4 문자열 다름");
		}
        
		// 1과 3의 비교
		if (strVal1 == strVal3) {  // 예상 : 다름
			System.out.println("1과 3의 메모리가 같음");
		} else {
			System.out.println("1과 3의 메모리가 다름");
		}
		
		if (strVal1.equals(strVal3)) { // 예상 : 문자열 같음
			System.out.println("1과 3이 같음"); 
		} else {
			System.out.println("1과 3이 다름");
		}
		
		
	}

}

결과 값


* String의 독특한 특징
- 관용적인 표현 " "로 둘러 쌈
String strVal1 = "서울";
String strVal2 = "서울";
- 동일한  표현이 있으면 메모리를 하나만 만든다
-> 동일한  표현이 있으면 최초에 나온 하나만 가르킴(이미 할당되어 있는 값을 가르킴)

strVal3 100번지
strVal4  100번지
100번지 서울

String strVal3 = new String("서울");
String strVal4 = new String("서울");
- new 연산자는 객체를 생성할 때 사용하고 Heap이라는 메모리 영역에 각각의 새로운 메모리 공간을 임의로 할당해주는 역할(생성자)

strVal3 100번지
strVal4  200번지
100번지 서울
200번지 서울

- 힙에 새로운 200번지를 할당함


5교시 

* 상식용어
- Iass(Infrastructure as a Service)
 기존의 서버 환경의 인프라를 클라우드 서비스로 제공하는 것
 서버, 스토리지, 네트워킹과 같은 컴퓨팅 자원을 사용할 수 있다.

-  Paas(Platform as a Service)
 인프라를 구축할 필요없이 개발자가 코드만 작성하면 서버 환경이 구성되는 것을 의미함
 사용자는 코드 작성 및 애플리케이션 구축에 집중할 수 있으며, 클라우드 제공자는 서버 프로비저닝, 리소스 확장 및 기본   인프라 관리와 같은 작업을 맡는다.
ex) 아마존

- Saas(Software as a Service)
 기존에는 패키지로 설치해야만 했던 애플리케이션을 브라우저를 통해 사용하도록 해주는 서비스를 의미한다
 Saas서비스로 구글 독스, 마이크로소프트365, 어도비 크리에이터 클라우드 등이 있습니다.
 최종소비자에게 서비스(관리소프트웨어)
 Saas가 가장 고급 서비스 

* gabage collecter
더 이상 사용하지 않는 객체를 쓰레기 객체로 취급하여 자동제거 함

* 배열
- 공통적인 타입의 데이터를 연속된 공간에 순서대로 나열한 것
- 같은 타입의 데이터만 저장할 수 있다(타입 불일치 컴파일 에러 발생)
- 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없다.
- for 루프와 잘 어울림


6교시

* 가위바위보 게임의 기초

1. 클래스 만들기(패키지명 - game)
2. 배열 이용하기
3-1. for 루프(시작과 끝 존재)
3-2. forEach(시작과 끝 지정 필요 없음)

public class RockPaperScissorsGame {

	public static void main(String[] args) {
		String[] rockpaperscissor = {"주먹", "보", "가위"}; // 초기화
		// 스트링 3개가 모여있다, 같은 유형의 변수를 처리하는 법 [배열]
		p(rockpaperscissor[0]);
		p(rockpaperscissor[1]);
		p(rockpaperscissor[2]);
        System.out.println("--------------------------");
		
		// 관련있는 데이터인 경우 : Enumeration 객체 = Iterator 객체
		for (String item : rockpaperscissor) {    // for ( 개별 항목 변수 : 열거 객체) {}
			p(item);
		}
        
        System.out.println("--------------------------");
		for (var item : rockpaperscissor) {   // var(타입추론) : 실제 변수의 타입을 실행 시 데이터를 보고 자동 판단(문자면 string)
			p(item);
		}
			
		
	}
	// 찍기
	public static void p(String msg) {   // p를 통해 메세지 출력
		System.out.println(msg);
	}
	
}

결과 값

public class RockPaperScissorsGame {

	public static void main(String[] args) {
		String[] rockpaperscissor = {"주먹", "보", "가위"}; // 초기화

		//for 루프로 각 요소에 접근 (정해진 횟수를 돌 때)
		p("배열의 크기 : " + rockpaperscissor.length); // length 배열의 개수를 반환함
		for (int i = 0; i < rockpaperscissor.length; i++) {
			p(rockpaperscissor[i]);
		}
		System.out.println("--------------------------");
		
		
	}
	// 찍기
	public static void p(String msg) {  // p를 통해 메세지 출력
		System.out.println(msg);
	}
	
}

- 배열의 0번째부터 배열의 길이까지 반복

결과 값


7교시

● Score 과목의 총점과 평균 구하기

public class Score {

	// main 구역
	public static void main(String[] args) {
		int maxSize = 5;  // 학생의 수
		int[] kor;        // 국어성적 배열(난수를 사용할 것이기 때문에 초기화를 바로 하지 않아도 됨)
		int[] eng;  
		int korTotal = 0; // 초기화
		int engTotal = 0;
		int korAvg = 0;
		int engAvg = 0;
		
		// 국어 성적 배열을 위한 방 생성
		kor = new int[maxSize];  // 학생의 최대 수 만큼 배열의 방 생성
		eng = new int[maxSize];
		
		// 학생의 각 과목 점수 입력(난수 사용)
		Random rand = new Random();
		
		for (int i = 0; i < maxSize; i++) {   // 국어
		kor[i] = rand.nextInt(101);  // 0~100점까지
		}
		
		for (int i = 0; i < maxSize; i++) {   // 영어
		eng[i] = rand.nextInt(101);  // 0~100점까지
		}
        
		// for ( 개별 항목 변수 : 열거 객체) {}
		for (int score : kor) { // 국어점수배열 확인
			p("국어 : " + score);
		}
		
		for (int score : eng) { // 영어점수배열 확인
			p("영어 : " + score);
		}
		
		// 국어 총점과 평균 구하기
		for (var score : kor) {
			korTotal = korTotal + score; // korTotal += score;(이전 토탈 값에 현재 국어 성적 값을 더하여 새로운 토탈 값으로 저장
		}
		korAvg = korTotal / maxSize;
        
		// 영어 총점과 평균
		for (var score : eng) {
			engTotal = engTotal + score;
		}
		/*for(int i = 0; i < maxSize; i++) {  //for문 사용 시, 개별 항목 변수와 동일
		*	engTotal = engTotal + eng[i];
		*/}
		engAvg = engTotal / maxSize;
		
		String scoreMsg = "국어총점 : " + korTotal + ", 국어평균 : " + korAvg;
		scoreMsg = scoreMsg + "\n영어총점 : " + engTotal + ", 영어평균 : " + engAvg;
		
		p(scoreMsg);
		
	}
    // main 밖의 구역
	public static void p (String msg) { // p를 통해 메세지 출력
		System.out.println(msg);
	}


● 배열 이론(책)

* heap 영역 
- 객체와 배열이 생성되는 영역

 

* 배열선언

1. 타입[] 변수;

2. 타입 변수[];

- [] 는 배열 변수를 선언하는 기호

 

* 배열생성

1. 값 목록을 이용

ex) 타입[] 변수 = {값0, 값1, 값2 ....};

2. new 연산자 이용

ex) 변수 = new 타입[] = {값0, 값1, 값2 ....};

-> 배열은 변수 선언을 하면서 동시에 초기화를 해야 함

'백엔드 > 자바' 카테고리의 다른 글

자바 - 6  (0) 2023.05.03
자바-5  (0) 2023.05.02
자바-3  (0) 2023.05.01
자바-2  (0) 2023.04.27
자바-1  (0) 2023.04.26