본문 바로가기

개발/Java

[Java] 자바 기초

<JDK, JRE ...차이>

JVM=(java virtual machine) 실행환경. 자바 코드 해석해서 실행시켜줌

JRE= JVM + 라이브러리

JDK= 개발툴 + JRE (JDK ≒ JDK)

 

Java SE (standard edition) =자바 표준 문법

Java EE=Java SE+확장버전

Java=언어

 

<JVM 메모리 구조>

프로그램을 수행하는데 필요한 메모리 할당 받고

이 메모리를 용도에 따라 여러 영역으로 분리하여 관리

 

메소드 영역=클래스 데이터, 애플리케이션에서 공유되는 데이터 저장

스택 영역=메소드 호출 시 생성되는 프레임이 저장됨. 각 프레임의 로컬 변수 등이 포함됨

힙 영역=객체와 배열이 저장. 참조 타입 변수는 힙 메모리의 객체를 참조함

<데이터 타입>

1. 기본 타입

=값 자체 저장, stack메모리에 할당

byte 1byte -128~127 정수형
short 2byte 정수형
char 2byte 0~65535(유니코드) 정수형. 음수 없음 
int 4byte 100000 정수형
long 8byte 10000000000l
float 4byte 3.14f
double 8byte 3.14
boolean 1byte true/false

2. 참조 타입

=생성된 객체 메모리 번지 저장, Heap메모리에 객체 할당

배열 타입

열거 타입

클래스 인터페이스

+) String도 참조 타입이다.

 

<Stack과 Heap>

변수들은 stack이라는 메모리 영역에 생성된다.

- 참조 타입 변수들은 힙 메모리 영역의 객체 번지를 저장하고

- 기본 타입 변수들은 직접 값을 저장한다.

 

<메모리 영역>

메소드 영역

=바이트코드 파일 읽은 내용이 저장되는 영역.

클래스별 상수, 정적필드, 메소드 코드, 생성자 코드 등이 저장됨

힙영역

=객체 생성되는 영역. 

스택 영역

=메소드 호출시 생성되는 프레임이 저장되는 영역

프레임 내부에 로컬 변수 스택이 있고

여기서 기본타입 변수 참조타입 변수가 생성되고 제거된다.

<타입 변환>

1. 강제 타입변환

큰 타입을 작은 타입으로 변경되는 것은 유의해야 한다.

 

int byte 를 예시로 보자 

int는 4byte이다. byte는 1byte이다.

4 byte를 4등분한 다음 필요 없는 부분은 날리고 1byte만 v2로 넘긴다.

 

+) 만약 v1이 1byte를 넘어가는 숫자라면 v2는 이상한 숫자가 나올 것이다.

int v1=00;
byte v2=(byte)v1;

long v3=200;
int v4=(int)v3;

2. 자동 타입 변환

작은 타입이 큰 타입으로 변경되는 것은 자동.

byte v3=100;
int v4=v3;

 

3. 연산식에서 타입 변환

byte,short,double 등은 연산할 시 int로 바뀐다.

그래서 필요하다면 다시 바꿔줘야함

byte var11=10;
byte var12=20;
byte var13=(byte)(var11+var12);

 

<string ↔ 숫자>

int value1=Integer.parseInt("10");
double value2=Double.parseDouble("3.14");
boolean value3=Boolean.parseBoolean("true");

String str1=String.valueOf(10);
String str2=String.valueOf(3.14);

 

<입출력>

입력 받기

Scanner scanner=new Scanner(System.in);
String str=scanner.nextLine();

출력 하기

result=10;
System.out.println(result);
System.out.println();

 

<String>

문자열 저장

name1과 name2는 같은객체 변수 저장, name3은 별도로 생성

String name1="침착맨"
String name2="침착맨"
String name3=new String("침착맨");

 

문자열 비교

객체 상관없이 문자열만 비교할시 equals()

참조는 다르고 문자열은 같기때문에 '문자열 같음' 만 출력된다.

String str1=new String("침착");
String str2=new String("침착");

if(str1==str2){System.out.println("참조 같음");}
if(str1.equals(str2)){System.out.println("문자열 같음");}

 

문자 추출

char v1=str.charAt(2);

 

문자 길이

int leng=str.length();

 

문자열 대체

String newStr=oldStr.replace("침착맨","이병건");

 

문자열 잘라내기

String v1=str.substring(a,b); //a~b-1 잘라낸다
String v2=str.substring(c); //0~c-1 잘라낸다

 

문자열 위치 찾기

해당 문자열의 위치를 반환한다.

만약 없다면 01를 반환

int index=str.indexOf("침착맨");

 

문자열 포함 여부

true,false로 반환

boolean result=str.contains("배신맨");

 

문자열 분리

split로 문자열을 배열로

String str="A,B,C,D";
String[] arr=str.split(",");

 

<Array>

int[] arr={1,2,3...};
int[][] arr=new int[2][3];

 

다차원 배열은 배열에 다른 배열을 대입한 것.

힙에 저장된 번지를 참조한다.

기본 타입 배열 = 각 항목에 값 직접 저장

참조 타입 배열 = 각 항목에 객체 번지 저장

 

배열 복사

System.arraycopy(원본배열, 복사 시작 index, 새배열, 붙여넣기 시작 index, 복사 항목 수);

System.arraycopy(arr1,0,arr2,0,arr1.length);

<API Document>

=라이브러리에서 사용할 수 있는 것들 설명서

https://docs.oracle.com/en/java/javase/21/docs/api/index.html

 

Overview (Java SE 21 & JDK 21)

This document is divided into two sections: Java SE The Java Platform, Standard Edition (Java SE) APIs define the core Java platform for general-purpose computing. These APIs are in modules whose names start with java. JDK The Java Development Kit (JDK) AP

docs.oracle.com

 

<Enum 타입>

참조 타입

public enum week {MONDAY,TUESDAY}
Week today=Week.MONDAY;

 

<computer 시간정보>

calendar

import java.utils.Calendar;

Calendar now=Calendar.getInstance();
int year=now.get(Calendar.YEAR);
int month=now.get(Calendar.MONTH);

 

<객체 지향 언어>

객체 지향 특징

캡슐화=(정보 은닉)객체의 데이터,메소드를 묶어서 내부 동작을 감추는 것

+) DTO(Data Transfer Object)=정보 전달용. 정보 전달만 가능하다. 그래서 getter/setter만 존재한다.

+) VO(Value Object)=로직을 포함할 수 있다. 생성자를 사용한다.

상속=부모객체의 데이터와 메서드 자식 객체가 사용하는 것. 코드 재사용성, 유지보수 시간 최소화

다형성=객체에 따라 다른 동작을 하는 것. 상속과 인터페이스로 구현

 

클래스=객체를 생성하기 위한 틀 (생성자, 필드, 메소드 등 포함)

- 필드=객체 데이터 저장하는 변수같은 존재 (고유, 상태, 부품 데이터 존재)

- 생성자=new로 객체 초기화

- 메소드=객체가 수행할 동작

객체=클래스로 만들어낸 것 / 객체 생성 - new 클래스()

인스턴스=클래스로 만들어져 실제 사용하는 객체

 

<Class>

public class ClassName //CamelStyle로 Class 이름 설정
{
    int fieldName; //field
    ClassName(String str, int num) { } //생성자 : 생성자 선언 안하면 기본 생성자가됨
    int methodName() { } //method
}

<field vs 변수>

method안에 선언된 것은 변수(local변수)

class선언 후 선언된 것은 field 변수

 

<생성자>

생성자를 호출 - 생성자를 실행 - 객체 완성됨

Car myCar=new Car("granger","black",300);

생성자 overloading - 객체 필드 다양한게 초기화하기 위해, 생성자 매개변수 다르게 해서 여러개 선언 하는 것.

 

<함수와 메소드>

호출하는 객체가 있는 경우 메소드, 없는 경우 함수

+ 모든 메소드는 클래스에 들어가있다.

+ 메소드명은 첫 문자 소문자이다.

 

<메소드 기본 구조>

접근 제한자, return type, 메소드명, 매개변수, return data

public String name(String n)
{ return n; }

'개발 > Java' 카테고리의 다른 글

[Java] java.base 모듈  (0) 2024.12.05
[Java] 자바 예외  (0) 2024.12.05
[Java] Interface  (0) 2024.12.04
[Java] 상속  (0) 2024.12.04
[Java] 클래스  (0) 2024.12.03