▸JAVA/기본 상식10 Java의 메모리 구조_메소드의 매개변수 [3/3] 이전 글에서 8가지 원시타입의 변수를 제외한 모든 변수는 참조 변수라고 했습니다. 이 구조를 이해하면 메소드 사용 시 실수를 피할 수 있습니다. C언어를 해보신 분들은 C언어의 함수와 포인터와 동일한 원리라고 이해하시면 됩니다. 아래 코드를 보시고 결과를 한 번 예측해보세요. package study.first; /* Public class */ public class Main { public static void main(String[] args) { String arr = "Hello"; print(arr); System.out.println(arr); } static void print(String text) { text += " world"; } } 정답은 "Hello"만 출력됩니다. C언어의 포.. ▸JAVA/기본 상식 2019. 12. 9. Java의 메모리 구조_자바가 상대적으로 느린 이유[2/3] C언어에 비해 Java가 느린 이유는 크게 2가지를 들 수 있을 것 같습니다. 첫 번째는 객체지향언어라는 특성 때문이고, 두 번째는 JVM이라는 가상 머신을 사용하기 때문입니다. 둘 다 개발자의 편의성을 위해 성능을 희생하고 있는데, 사실 하드웨어도 빨라지고 Java 자체의 소프트웨어도 워낙 발달해서 초기에 이슈가 됐던 성능 이슈가 잠잠해졌습니다. 하지만 여전히 하드웨어 스펙을 짱짱하게 넣지 못하는 소규모 장비 등에서는 C언어를 주로 사용한다고 합니다. [ 객체지향언어의 특성으로 인한 느림 ] Java에서는 클래스 단위로 모든 코드를 작성합니다. C언어와 같이 함수 단위가 아닙니다. 따라서 다른 클래스에 있는 일부 메소드나 정보를 사용하기 위해서는 전체 클래스를 인스턴스로 만들어 메모리에 저장해야 합니다.. ▸JAVA/기본 상식 2019. 12. 9. Java의 메모리 구조_기본 구조[1/3] 개발자 입장에서 프로그램이 어떻게 돌아가는지와 효율적인 메모리 관리를 어떻게 해야하는지에 대해 큰 줄기만 정리해보겠습니다. 가장 기본 언어이자 기본 구조인 C언어의 메모리 구조와 비교하면서 보시면 이해가 더 잘될 것 같습니다. 혹시 C언어의 메모리 구조 또는 스택/힙 메모리에 대해 잘 모르시는 분은 아래 두 개 글을 참고하시면 됩니다. 2019/12/05 - [C언어/기본상식] - C언어의 메모리_기본 구조 [1/2] 2019/12/05 - [C언어/기본상식] - C언어의 메모리_스택 메모리 [2/2] 먼저 소스코드를 작성하고 컴파일하면 JDK에 들어 있는 컴파일러가 바이트 코드로 번역해서 .class 파일을 만들어 줍니다. 바이트 코드는 기계가 못 읽고 Java만 알 수 있는 중간 언어입니다. 그리.. ▸JAVA/기본 상식 2019. 12. 9. 클래스, 인스턴스, 객체의 차이 혼용하거나 좁은 의미로 쓰기도 하지만 세 가지는 모두 다른 의미를 가지고 있습니다. 사실 클래스와 인스턴스는 의미가 명확한데 객체라는 것은 워낙 포괄적인 의미라 모호할 수 있으니 정확한 개념을 잡고 있어야 커뮤니케이션에 오류가 줄어들 것 같습니다. [ 클래스 ] 클래스가 어떻게 생겼는지 정해둔 양식지, 설계도 C언어의 구조체 정의와 같음 (실제로 사용하기 전 구조체 정의만 한 상태) 설문조사를 하기 위해 설문조사 항목(변수)와 절차(메소드)를 하나의 문서로 만들어서 컴퓨터에 저장해둔 상태가 클래스입니다. 즉, 아직 인쇄되진 않고 양식만 존재하는 상태입니다. [ 인스턴스 ] 클래스를 담은 일종의 클래스 변수 C언어 구조체에서 구조체 타입 변수 하나를 생성한 것과 동일 객체의 하위 개념 (같은 개념은 .. ▸JAVA/기본 상식 2019. 12. 9. 객체지향 언어의 특징(다형성) [4/4] 4. 다형성 하나의 클래스나 메소드가 다양한 방식으로 동작이 가능한 것을 의미 부모클래스가 자식클래스의 값으로 대체되는 오버라이딩 같은 메소드의 매개변수(parameter)에 따라 다르게 동작하는 오버로딩 다형성 또한 상속과 마찬가지로 객체지향 고유의 특징입니다. 예를 들어 C언어에서 아래와 같은 프로그램을 만들었다고 가정하겠습니다. 서로 입력값의 갯수 또는 타입이 다르기 때문에 모두 다른 함수로 만들어줘야 합니다. "인자값을 받아서 특정한 결과값을 출력한다"라는 공통적인 행위이지만, 각자 개별적이고 독립적인 함수(일종의 객체)로 실행됩니다. 우리가 한 파일에다가 함수들을 모아둘 순 있지만 기본적으로 저 함수들은 그냥 서로 연관성이 1도 없는 개별적 함수들로 존재합니다. 저런 게 10가지가 있다면.. ▸JAVA/기본 상식 2019. 12. 9. 객체지향 언어의 특징(상속) [3/4] 3. 상속 재사용성을 극대화시키기 위한 장치 부모 클래스의 속성을 그대로 물려받음 (물론 설정에 따라 완전히 같지 않을 수 있음) 상속의 개념은 매우 쉽습니다. 자식 클래스는 부모 클래스의 속성을 물려받도록 한다는 것이죠. C언에는 상속이라는 개념이 없습니다. 그냥 기존 함수 코드를 복사해서 붙여놓고 그 아래에 더 필요한 부분을 추가해줘야 합니다. 한 두개 정도라면 별 무리가 없지만 만약 100개의 함수에 공통된 부분이 10줄 존재한다면 코드 중복이 1000줄 발생하는 문제점이 생기죠. Java에서는 상속이라는 기능을 이용해서 위 과정을 매우 직관적이고 간단하게 만들어 줬습니다. 이미 만들어둔 코드의 재활용성을 극대화시키고 거기에 코드가 간결해지는 효과도 낼 수 있습니다. 오버라이딩 같은 기능과 함께.. ▸JAVA/기본 상식 2019. 12. 9. 객체지향 언어의 특징(캡슐화) [2/4] 2. 캡슐화 내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 사용방법만을 노출시킨다. 중요 정보를 숨겨(정보 은닉) 잘못된 수정을 막고, 사용자가 쉽게 사용할 수 있도록 만들어 줌 굳이 사용자가 알 필요가 없는 부분은 접근할 수 없도록 꽁꽁 싸서 캡슐안에 넣어둔다는 의미에서 캡슐화라고 합니다. 클래스 변수(필드)가 될 수도 있고 메소드가 될 수도 있습니다. 내가 만든 클래스에서 불필요한 곳에는 직접 접근할 수 없도록 하여 리소스의 공유와 보안 사이의 균형을 맞춰주는 것입니다. 적절한 예로 해쉬 사례를 들 수 있을 것 같습니다. 제가 어떤 문자열을 주면 해쉬값으로 바꿔주는 함수를 C언어로 하나 만든다고 해보겠습니다. 함수의 기본 뼈대는 "문자열 순서에 따라 아스키코드에 특정 값을 곱해서 더.. ▸JAVA/기본 상식 2019. 12. 9. 객체지향 언어의 특징(추상화) [1/4] 그럼 객체지향언어가 가지고 있는 대표적인 특징을 기준으로 C언어와 Java를 비교해보겠습니다. 1. 추상화 (Abstract) 중요한 정보만을 표현함으로써 공통의 속성이나 기능을 묶어 이름을 붙이는 것 Java에서는 하나의 객체를 추상화하여 클래스를 만든다고 표현함 C언어에서는 구조체가 Java의 클래스에 가장 가까운 개념입니다. 어떠한 목적에 필요한 타입이 다른 여러 변수를 하나의 구조체에 묶어서 정의해둠으로써, 필요할 때 그 구조 전체를 가져다 쓰는 것이죠. 사실 변수들을 각자 따로 만들어서 써도 무방하지만 구조체를 이용하면 보다 직관적으로 데이터 구조를 확인하고 사용할 수 있습니다. 이 개념이 확장되어 발전된 것이 객체이며 Java의 클래스라고 볼 수 있습니다. 같은 구조의 정보를 담는 변수.. ▸JAVA/기본 상식 2019. 12. 9. 객체지향 언어와 절차지향 언어와의 차이 Java를 하면서 가장 먼저 알아야 할 객체지향언어의 개념을 정리해봤습니다. 절차지향 언어의 대표주자인 C언어와, 객체지향 언어의 대표주자인 Java를 기준으로 설명했습니다. 먼저 절차지향언어와 객체지향언어는 대립점에 있는 개념이 아닙니다. 모든 컴퓨터 언어는 기본적으로 절차(순서)에 따라 실행됩니다. 기본적으로 객체지향언어도 절차대로 수행되는 컴퓨터 언어입니다. 그저 더 중요시하는 "사상"이 다를 뿐입니다. 어떤 프로그램이라도 절차지향언어로 만들 수도, 객체지향 언어로 만들 수 있습니다. 만드는 과정이 조금 다를 뿐입니다. 예를 들어 된장찌개를 끓인다고 가정해보겠습니다. 춘향이는 절차를 지향해서 아래와 같이 순서대로 요리를 합니다. 길동이는 객체를 지향해서 아래와 같이 미리 재료를 다 준비해두고 한.. ▸JAVA/기본 상식 2019. 12. 9. 워크스페이스/프로젝트/패키지/클래스의 개념 및 명명 규칙 C에서 JAVA로 넘어오니, 해당 개념이 헷갈려서 정리해봅니다. 이클립스 기준입니다. 먼저 전체적인 구조는 아래와 같습니다. 실제 우리가 코딩을 하는 부분은 모두 "클래스(Class)"입니다. 나머지는 분류를 위한 일종의 카테고리라고 볼 수 있습니다. ※ 공통 명명 규칙 - 대소문자 구분이 됨 - 예약어(시스템에서 이미 사용하고 있는 이름)를 사용하면 안됨 - 숫자로 시작할 수 없음 - 특수문자는 '_'(언더바), '$'만 사용가능 [ 워크스페이스(WorkSpace) ] 하나의 프로그램 단위 규모가 큰(기능이 많은) 프로그램은 여러 실행파일(프로젝트)로 이루어질 수 있음 가장 상위 폴더로 생성됨 ※ 워크스페이스 명명(이름) 규칙 - 공통규칙에 따름 [ 프로젝트(Project) ] 하나의 실행파일 단위.. ▸JAVA/기본 상식 2019. 12. 9. 이전 1 다음 💲 추천 글 반응형