본문 바로가기

JAVA

[JAVA] 전체 개념 한눈에 보기

🧼스택 메모리와 힙 메모리의 차이점

 

스택 메모리: 메서드 내의 지역 변수 저장소. String name=new String("noel")으로 이름을 받으면, name값의 메모리주소가 저장된다. 

힙 메모리: 객체와 인스턴스가 저장되는 영역. 할당된 noel이름이 저장되어있는 위치

 

 

 

🧼주석

//한줄주석

/*두줄
주석*/

 

 

🧼상수

변경할 수 없는 값

final 자료형 변수명 = 값;

 

 

🧼산술 연산자

나누기 /
나머지 %

 

🧼논리 연산자

그리고 &&
또한 ||

 

🧼삼항 연산자

조건 ? 참일때 : 거짓일 때

 

물음표 왼쪽의 조건이 참이면 왼쪽 거짓이면 오른쪽

int x=3;
int y=5;
int max=(x>y) ? x : y

 

🧼문자열 

☑️문자열 메서드

string에서 제공하는 메서드1
string에서 제공하는 메서드2
정적 메서드

 

 

 

관련 정리글

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 같은 패키지 내에서, 다른 패키지인 경우 자식 클래스에서

 

 

 

🧼  패키지

관련 클래스들을 그룹화 (폴더)

 

package sample;

public class MyClass{

}

 

 

이런식으로 불러오기도 가능하다

import 패키지명.클래스명

 

#활용 예시
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 클래스

기본 자료형 + 추가 기능 제공 클래스

Integer  <ㅡ int
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

동적 배열 : 처리할 데이터의 개수가 고정되지 않은 유동적인 배열 지원. 

 

ArrayList<참조타입> 참조변수=new 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(); // 폴더생성

 

 

 

 

 

 

 

 

 

 

참고자료

https://youtu.be/DNCBaeCoMug?si=M0hWT5Koej2WHpuJ

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%97%B4%EA%B1%B0%ED%98%95Enum-%ED%83%80%EC%9E%85-%EB%AC%B8%EB%B2%95-%ED%99%9C%EC%9A%A9-%EC%A0%95%EB%A6%AC

반응형