🧼스택 메모리와 힙 메모리의 차이점
스택 메모리: 메서드 내의 지역 변수 저장소. String name=new String("noel")으로 이름을 받으면, name값의 메모리주소가 저장된다.
힙 메모리: 객체와 인스턴스가 저장되는 영역. 할당된 noel이름이 저장되어있는 위치
🧼주석
//한줄주석
/*두줄
주석*/
🧼상수
변경할 수 없는 값
final 자료형 변수명 = 값;
🧼산술 연산자
나누기 | / |
나머지 | % |
🧼논리 연산자
그리고 | && |
또한 | || |
🧼삼항 연산자
조건 ? 참일때 : 거짓일 때
물음표 왼쪽의 조건이 참이면 왼쪽 거짓이면 오른쪽
int x=3;
int y=5;
int max=(x>y) ? x : y
🧼문자열
☑️문자열 메서드
관련 정리글
https://isdiary.tistory.com/172
[JAVA] char, string , stringbuffer 설명
char문자타입의 char으로 2byte크기를 차지한다. 단 하나의 문자만 저장한다작은따옴표( ' ' )만을 사용한다컴퓨터 내부에 저장할 땐 아스키코드(정수형)으로 치환되어 저장된다 public class CharCheck { p
isdiary.tistory.com
☑️정수비교
int x=3;
int y=3;
System.out.println(x==y); //true
☑️ 문자열비교
int x='java';
int y='java';
System.out.println(x==y); //true? NO!
이렇게 되면 x가 java라는 문자열 위치를 참조하고 , y도 java라는 문자열 위치 참조하는걸로 된다.
#맞는 코드
int x=new String ("java");
int y=new String ("java");
System.out.println(x.equals(y)); //true
이렇게 되면 서로 다른 곳을 참조하게 되는 것이다
🧼 if
if (조건)
명령문
else
명령문
또는
if (조건) {
명령문1
명령문2
...
}
else {
명령문
...
}
🧼 else if
if (조건)
명령문
else if
명령문
else
명령문
if (조건) {
명령문1
명령문2
...
}
else if{
명령문
...
}
else {
명령문
...
}
🧼 switch
switch (조건) {
case 값1:명령문
break;
case 값2: 명령문
break;
default: 명령문
}
🧼 for
for (선언;조건;증강)
명령문
for (int i=0;i<5;i++){
System.out.println("안녕");
}
🧼 while
while (조건)
명령문
🧼 do while
do
명령문
while(조건):
🧼 break, continue
반복문 탈출 , 반복문 건너뛰기
🧼 배열
자료형 [ ] 변수명 = new 자료형[크기]
괄호의 위치를 바꿔도 가능하다.
자료형 변수명 [ ] = new 자료형 [크기];
값을 미리 넣어줄 수 도 있다.
자료형 [ ] 변수명 = new 자료형 [ ] { 값1, 값2, .... };
자료형 [ ] 변수명 = {값1, 값2, ...}
🧼 배열 순회
배열 에서 가져올 항목이 있으면 변수에 대입하며 본체 실행
for (데이터타입 변수 : 배열/컬렉션) {
//i
}
int [ ] numbers={1,2,3,4,5};
for (int i:numbers) {
System.out.println(i);
}
/*출력결과
1
2
3
4
5
*/
🧼 다차원 배열
int [ ] [ ] numbers= new int [2][5]
//세로2 가로5 배열
int [] [] numbers=new int [][]{
{1,2,3,4,5},
{6.7.8.9.10}
}
🧼 메소드
특정 기능을 수행하기 위한 코드 묶음
public static void print(){
System.out.println("안녕");
}
public static void main(String[] args){
print(); //메소드 호출
}
🧼 메소드 오버로딩
같은 이름의 메소드를 중복하여 정의하는 것
public static intadd(inta, intb) {
return a + b;
}
public static intadd(inta, intb, intc) {
return a + b + c;
}
public static double add(double a, double b) {
return a + b;
}
public static void main(String [] args){
System.out.println(add(1, 2));
System.out.println(add(1, 2, 3));
System.out.println(add(5.3, 3.8));
}
🧼 변수의 범위
주어진 함수 안에서 변수를 활용.
public static void scope() {
intb = 20;
System.out.println(b);
}
public static void main(String[] args) {
System.out.println(b); // 사용불가
}
if조건문 내에서만 변수 활용 가능한 예시
public static void main(String[] args) {
intc = 30;
if (c > 10) {
intd = 40;
System.out.println(d);
}
System.out.println(d); // 사용불가
}
🧼 클래스
예를들면
클래스
색종이
객체
색종이로 접은 학
색종이로 접은 하트
색종이로 접은 비행기
class Person {
}
public static void main(String[] args) {
Person person= new Person();
}
🧼 인스턴스 변수
클래스 내에서 선언된 변수
class Person{
String name;
int age;
}
public static void main(String[] args) {
Person person= new Person();
person.name="철수";
person.age=20;
}
🧼 클래스 변수
클래스 내에서 static으로 선언된 변수
모든 객체가 공유하는 변수
class 클래스명{
static 클래스변수1
static 클래스변수2
…
}
객체를 만들 필요 없이 클래스 명으로 접근
class Person {
String name;
intage;
static int personCount= 0;
}
public static void main(String[] args) {
Person.personCount= 10;
System.out.println(Person.personCount); // 10
}
🧼 인스턴스 메소드
클래스 내에 정의된 메소드
class Person{
String name;
int age;
static int personCount=0;
public void introduce(){
System.out.prinln("이름"+name);
System.out.prinln("나이"+age);
}
}
public static void main(String [] args){
Person person=new Person();
person.name="철수";
person.age=20;
person.introduce();
}
🧼 클래스 메소드
클래스 내에 static으로 정의된 메소드
class Person{
String name;
int age;
static int personCount=0;
public void printPersonCount(){
System.out.println(PersonCount);
}
}
public static void main(String [] args){
Person.personCount=10;
Person.printPersonCount();
}
🧼 This
class Person {
String name; //a
public void setName(String name) { //b
this.name = name; //this.name은 a의 name을 나타내고 , name은 b의 name을 나타냄
}
}
🧼 생성자
객체가 생성될 때 호출되는 메소드
class Person {
String name;
intage;
Person(String name, intage) {
this.name = name; //초기화 작업
this.age= age;
}
}
public static void main(String[] args) {
Person person= new Person("철수", 20);
}
🧼 getter, setter
getter : 인스턴스 변수의 값 반환
setter : 인스턴스 변수의 값 설정
#Getter
class Person {
int age;
public int getAge() {
return age;
}
}
#Setter
class Person{
int age;
public void setAge(int age){
this.age=age;
}
}
#Getter & Setter
public static void main(String[] args) {
Person person= new Person();
person.setAge(20); #age 값 설정
System.out.println(person.getAge()); #age 값 가져옴
}
🧼 접근제어자
접근 권한 지정
접근제어자 class 클래스명 {
접근제어자 인스턴스 변수
접근제어자 인스턴스 메소드
}
class Person {
privateintage;
publicvoid setAge(intage) {
this.age= age;
}
}
접근 제어자 | 접근 가능 범위 |
private | 해당 클래스 내에서만 |
public | 모든 클래스에서 |
default | 같은 패키지 내에서만 아무것도 적지 않았을 |
protected | 같은 패키지 내에서, 다른 패키지인 경우 자식 클래스에서 |
🧼 패키지
관련 클래스들을 그룹화 (폴더)
public class MyClass{
}
이런식으로 불러오기도 가능하다
#활용 예시
import java.util.Random;
#또는 import java.util.* ->패키지 내 여러 클래스 사용하는 경우
public class MyClass{
public static void main(String[] args) {
Random random= new Random();
intnum= random.nextInt();
}
}
🧼 상속
특정 클래스의 기능을 재사용 및 확장. 보통 부모를 정의하고 자식들 클래스를 정의하지 않고 자식들의 클래스 중에서 겹치는게 많다 ㅡ> 부모 클래스 정의 하는 식으로 사용
class 자식 클래스명 extends 부모 클래스명{
}
🧼 메소드 오버라이딩
부모 클래스의 메소드 재정의
class Person {
public void introduce() {
System.out.println("사람입니다");
}
}
class Student extends Person {
public void introduce() {
System.out.println("학생입니다");
}
}
🧼 다형성
대입되는 객체에 따라서 메서드를 다르게 동작하도록 구현하는 기술. move라는 함수를 부르면 물고기는 swim, 새는 fly, 동물은 run처럼 다양하게 구현되도록 하는 것.
예를들면 위와 같은 class 가 만들어 졌을 때
public static void main(String[] args) {
Person person= new Person();
Person student= new Student();
}
이렇게 호출해도 가능하다.
학생입니다
결과는 이렇게 나온다.
🧼 Super
부모 클래스 접근
class Person {
int age;
Person(int age) {
this.age= age;
}
}
class Student extends Person {
String school;
Student(int age, String school) {
super(age); //부모클래스의 age에 저장
this.school= school;
}
}
🧼 참조 자료형
기본자료형 | 실제 값 저장 | int,float,double ... |
참조 자료형 | 값이 저장된 메모리 주소를 저장 | String, Person, Student |
🧼 final
변경 할 수 없게 함
class Person {
finalString name = "철수";
public final void introduce() {
System.out.println("사람입니다"); #자식 함수가 오버라이딩 불가
}
}
🧼 열거형(Enum)
Enum은 Enumeration의 약자다. Enumeration은 열거, 목록, 알람표라는 뜻을 가지고 있다. 즉 상수 데이터들의 집합이라고 치부하면 된다.
대표적으로는 '요일'이나 '계절' 같이 한정된 데이터 묶음을 열거형 타입인 Enum으로 묶어 구조적으로 프로그래밍 할 수 있도록 한다.
Enum 선언
enum Day{
MONDAY,TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
enum Month{
JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY,
AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER;
}
enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
Enum 참조 방식
// 열거타입 변수 = 열거타입.열거상수;
Week monday = Week.MONDAY;
Week sunday = Week.SUNDAY;
한가지 알아 둘 점은 heap 영역에 저장된다는 점. 각 enum 상수들은 별개의 메모리 주소값을 가짐으로써 완벽히 독립된 상수 구성.
enum상수들을 배열로 만들어 저장할 시에도 , 각 배열 원소들마다 참조 주소들값이 저장되어 힙영역의 상수 데이터들을 가리키게 된다
// enum Week 의 모든 상수값들을 배열로 변환
Week[] days = Week.values();
enum Gender {
MALE,
FEMALE
}
class Person {
Gender gender; #Gender 열겨형명
public void setGender(Gender gender) {
this.gender= gender;
}
}
public static void main(String[] args) {
Person person= new Person();
person.setGender(Gender.MALE); // MALE, FEMALE
}
switch (person.gender) { #보통 switch문에서 많이 쓰인다.
case MALE: System.out.println("남자"); break;
case FEMALE: System.out.println("여자"); break;
}
}
🧼 추상클래스
아직 완성되지 않은 클래스
abstract class 클래스명{
}
abstract class Shape {
abstract double calculateArea(); #미완성
}
class Square extends Shape {
private double s;
public Square(double s) {
this.s= s;
}
double calculateArea() {
return s * s; #자식클래스에서 미완성된 함수 완성
}
}
🧼 인터페이스
클래스를 작성할 때 기본이 되는 뼈대
인터페이스를 활용해 함수를 작성할 때는 그 안에 활용된 함수가 반드시 들어가 있어야 함
interface 인터페이스명{
}
interface Shape {
double calculateArea();
}
class Square implements Shape {
private double s;
public Square(double s) {
this.s= s;
}
double calculateArea() { #반드시 재정의 되어야 함
return s * s;
}
}
🧼 제네릭스
다양한 형태의 데이터를 다룰 수 있게 함
T 변수명
원래 이렇게 표현될 수 있는데
public static void main(String[] args) {
int intValue= 3;
double doubleValue= 3.14;
String stringValue= "안녕";
printValue(intValue);
printValue(doubleValue);
printValue(stringValue);
}
public static void printValue(int value) {
System.out.println(value);
}
public static void printValue(double value) {
System.out.println(value);
}
public static void printValue(String value) {
System.out.println(value);
}
이렇게 제네릭스를 사용하면서 어떤 변수가 들어와도 똑같은 동작을 하도록 해줌
public static <T> void printValue(T value) {
System.out.println(value);
}
🧼 제네릭 클래스
제네릭 기반클래스
class 클래스명 <T>{
}
정수와 문자열을 담을 수 있는 box 클래스를 선언
class BoxInteger{
int data;
public void setData(int data){
this.data=data;
}
}
class BoxString{
String data;
public void setData(String data){
this.data=data;
}
}
🧼 wapper 클래스
기본 자료형 + 추가 기능 제공 클래스
Double <ㅡ double
Character <ㅡchar
public static void main(String[] args) {
Integer i= 1;
Double d = 1.0;
Character c = 'a';
System.out.println(i.intValue());
System.out.println(d.intValue());
System.out.println(c.charValue());
}
🧼 ArrayList
동적 배열 : 처리할 데이터의 개수가 고정되지 않은 유동적인 배열 지원.
*참조타입은 Integer,Long,Short,Float,Double,Character,Boolean 등을 사용한다
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("철수");
list.add("영희");
list.add("영철");
list.remove(1); //remove를 사용하면 인덱스번호1은 영철로 변함
for (String s: list) {
System.out.println(s);
}
}
배열과 리스트 차이점
🧼 LinkedList
연결 리스트, 데이터의 빠른 삽입+삭제
LinkedList<T>
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("철수");
list.add("영희");
}
🧼 HashSet
순서, 중복을 허용하지 않는 데이터 집합
HashSet<T>
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("철수");
set.add("영희");
set.add("철수");
}
🧼 HashMap
(Key,Value) 자료구조 , 중복x순서x
HashMap<K,V>
public static void main(String[] args) {
// 이름, 점수
HashMap<String, Integer> map = new HashMap<>();
map.put("철수", 100);
map.put("영희", 90);
}
🧼 Iterator
컬렉션의 모든 데이터 순회
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("철수");
list.add("영희");
/*for (String s: list) {
System.out.println(s);
}*/
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
🧼 익명클래스
한 번만 사용되는 이름 없는 클래스
class Person {
public void introduce() {
System.out.println("사람입니다");
}
}
public static void main(String[] args) {
Person person= new Person() {
@Override
public void introduce() {
System.out.println("익명입니다"); //익명클래스
}
};
person.introduce();
}
🧼 람다식
간결한 형태의 코드 묶음
(전달값1,전달값2 , ...)->{코드}
(x,y)->x+y
🧼 함수형 인터페이스
람다식을 위한 인터페이스
@FunctionalInterface
interface 인터페이스명{
// 하나의추상메소드
int calculate(int x, int y);
}
🧼 스트림
배열, 컬렉션 데이터를 효과적으로 처리
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
.filter(n -> n % 2 == 0) // 짝수만필터링
.map(n -> n * 2) // 각요소값을2배로변환
.forEach(System.out::println); // 결과출력
}
🧼 예외처리
try{
명령문
} catch(변수1){
예외처리
} finally{
항상 실행되는 명령문
}
🧼 예외 발생시키기
throw new 예외();
throw new Exception("나이는 음수일 수 없습니다");
🧼 Try With Reources
리소스 관리를 편하게
try(자원할당){ //자원할당 = FileWriter writer= new FileWriter("file.txt")같은 것이 들어옴
명령문
}catch(변수){
예외처리
}
🧼 사용자 정의 예외
직접 정의한 예외
class 클래스명extends Exception {
}
🧼 예외 처리 미루기
메소드를 호출한 곳에서 처리
반환형 메소드명() throws 예외{
명령문
}
public static int divide(int a,int b) throws Exception{
return a/b
}
🧼 쓰레드
여러 작업을 동시에
class 클래스명 extends Thread{
public void run(){
}
}
🧼 Runnable
여러 작업을 동시에
class 클래스명 implements Runnable{
public void run(){
}
}
🧼 Join
쓰레드 실행 마칠 때까지 대기
🧼 다중 쓰레드
여러 쓰레드를 동시에
🧼 동기화
동시에 접근하지 못하게
synchronized 메소드명(){
}
synchronized(변수){
}
🧼 입출력과 파일
Scanner sc=new Scanner(System.in);
System.out.println("정수입력");
int number=sc.nextInt();
System.out.println("입력된 정수"+number);
String fileName="test.txt"
File file=new File(fileName);
try{
file.createNewFile(); //파일생성
} catch(IOExceptione){
throw new RuntimeException(e);
}
String folderName= "test";
File folder = new File(folderName);
folder.mkdir(); // 폴더생성
참고자료
'JAVA' 카테고리의 다른 글
[JAVA] 문자열이 영어로 되어있는지 판단하기(정규표현식) (0) | 2025.04.23 |
---|---|
[JAVA] char, string , stringbuffer 설명 (1) | 2025.04.12 |
[JAVA 기초] Collections (0) | 2023.03.13 |
[JAVA 기초] 문자열 클래스 (0) | 2023.03.13 |
[JAVA 기초] 23강 람다식 (0) | 2023.03.12 |