├── .gitingore ├── .vscode └── settings.json ├── course ├── Module01_java_overview │ ├── contents │ │ ├── 01_overview_java.adoc │ │ ├── 02_introduction_java_platform.adoc │ │ ├── 03_java_software_platform.adoc │ │ ├── 04_java_programming_language.adoc │ │ ├── 05_write_once_run_anywhere.adoc │ │ ├── 06_java_virtual_machine.adoc │ │ ├── 07_overview_java_virtual_machine.adoc │ │ ├── 08_java_operation_principle.adoc │ │ ├── 09_jdk_jre.adoc │ │ ├── 10_jvm_language.adoc │ │ ├── 11_history_java.adoc │ │ ├── 12_history_java_2.adoc │ │ ├── 13_jdk_provider.adoc │ │ ├── 14_lab1-1.adoc │ │ ├── 15_lab1-2.adoc │ │ └── images │ │ │ ├── image01.png │ │ │ ├── image02.png │ │ │ ├── image03.png │ │ │ ├── image04.png │ │ │ ├── image05.png │ │ │ ├── image06.png │ │ │ ├── image07.png │ │ │ ├── image08.png │ │ │ ├── image09.png │ │ │ ├── image10.png │ │ │ ├── image11.png │ │ │ └── image12.png │ └── readme.adoc ├── Module02_Java_progrmming_language_overview │ ├── LabFile │ │ └── Lab02.zip │ ├── contents │ │ ├── 01_Java_language.adoc │ │ ├── 02_java_program_structure.adoc │ │ ├── 03_hello_world.adoc │ │ ├── 04_class.adoc │ │ ├── 05_main_method.adoc │ │ ├── 06_java_langa_package.adoc │ │ ├── 07_demo.adoc │ │ ├── 08_basic_inputout.adoc │ │ ├── 09_systemclass.adoc │ │ ├── 10_standard_output.adoc │ │ ├── 11_scanner_class.adoc │ │ ├── 12_recommandations.adoc │ │ ├── 13_comments.adoc │ │ ├── 14_javadoc.adoc │ │ ├── 15_exception.adoc │ │ ├── 16_demo2.adoc │ │ ├── 17_compile_run_debug.adoc │ │ ├── 18_invoking_compiler.adoc │ │ ├── 19_run_java_program.adoc │ │ ├── 20_debugging.adoc │ │ ├── 21_jdk_tools.adoc │ │ ├── 22_lab2-1.adoc │ │ ├── 23_lab2-2.adoc │ │ ├── 24_lab2-3.adoc │ │ └── images │ │ │ ├── image01.png │ │ │ ├── image02.png │ │ │ ├── image03.png │ │ │ ├── image04.png │ │ │ ├── image05.png │ │ │ ├── image06.png │ │ │ ├── image07.png │ │ │ ├── image08.png │ │ │ ├── image09.png │ │ │ ├── image10.png │ │ │ ├── image11.png │ │ │ ├── image12.png │ │ │ ├── image13.png │ │ │ ├── image14.png │ │ │ ├── image15.png │ │ │ ├── image16.png │ │ │ ├── image17.png │ │ │ ├── image18.png │ │ │ ├── image19.png │ │ │ ├── image20.png │ │ │ ├── image21.png │ │ │ ├── image22.png │ │ │ ├── image23.png │ │ │ ├── image24.png │ │ │ ├── image25.png │ │ │ ├── image26.png │ │ │ ├── image27.png │ │ │ ├── image28.png │ │ │ ├── image29.png │ │ │ ├── image30.png │ │ │ └── image31.png │ └── readme.adoc ├── Module03_primitive_data_type │ ├── .DS_Store │ ├── contents │ │ ├── 00_introduction.adoc │ │ ├── 01-1_value_ref.adoc │ │ ├── 01-2_valuetype_reftype.adoc │ │ ├── 01-3_java_primitive_data_type.adoc │ │ ├── 01-4_primitive_data_type.adoc │ │ ├── 02-1_variable_naming.adoc │ │ ├── 02-2_naming_rule.adoc │ │ ├── 02-3_naming_recommandation.adoc │ │ ├── 02-4_java_keyword.adoc │ │ ├── 03-1_using_primitive_types.adoc │ │ ├── 03-2_locationvariable_assign.adoc │ │ ├── 03-3_compoundassignment.adoc │ │ ├── 03-4_operator.adoc │ │ ├── 03-5_incrementoperation.adoc │ │ ├── 03-6_priority.adoc │ │ ├── 04-1_type_casting.adoc │ │ ├── 04-2_type_casting_rule.adoc │ │ ├── 04-3_implicit_casting.adoc │ │ ├── 04-4_explicit_casting.adoc │ │ ├── 04-5_typecasting.adoc │ │ ├── 99_review.adoc │ │ └── images │ │ │ ├── image01.png │ │ │ ├── image02.png │ │ │ ├── image03.png │ │ │ └── image04.png │ └── readme.adoc ├── Module04_statement_and_exception │ ├── .DS_Store │ ├── LabFile │ │ ├── Lab4-1.zip │ │ └── Lab4-2.zip │ ├── contents │ │ ├── 01_statement_and_exception.adoc │ │ ├── 02_statement_overview.adoc │ │ ├── 03_block.adoc │ │ ├── 04_statement.adoc │ │ ├── 05_selection_statement.adoc │ │ ├── 06_if_statement.adoc │ │ ├── 07_cascading_if.adoc │ │ ├── 08_switch.adoc │ │ ├── 09_iteration.adoc │ │ ├── 10_while.adoc │ │ ├── 11_do.adoc │ │ ├── 12_for.adoc │ │ ├── 13_foreach.adoc │ │ ├── 14_jump_statement.adoc │ │ ├── 15_goto.adoc │ │ ├── 16_break_continue.adoc │ │ ├── 17_lab4-1.adoc │ │ ├── 18_exercise.adoc │ │ ├── 19_lab4-1.adoc │ │ ├── 20_exceptions.adoc │ │ ├── 21_why_exceptions.adoc │ │ ├── 22_exception_object.adoc │ │ ├── 23_try_catch_block.adoc │ │ ├── 24_multiple_catch_block.adoc │ │ ├── 25_throw_exception.adoc │ │ ├── 26_throw.adoc │ │ ├── 27_exception_method.adoc │ │ ├── 28_finally.adoc │ │ ├── 29_try_with_resource.adoc │ │ ├── 30_lab4-2.adoc │ │ ├── 31_review.adoc │ │ └── images │ │ │ ├── image01.png │ │ │ ├── image02.png │ │ │ ├── image03.png │ │ │ ├── image04.png │ │ │ ├── image05.png │ │ │ └── image06.png │ ├── homework │ │ └── maze.adoc │ └── readme.adoc ├── Module05_method_parameter │ ├── .DS_Store │ ├── Code │ │ └── Anagram.java │ ├── LabFile │ │ ├── Lab 5-1.zip │ │ └── Lab 5-2.zip │ ├── contents │ │ ├── 01_method_parameter.adoc │ │ ├── 02_method.adoc │ │ ├── 03_method_declareation.adoc │ │ ├── 04_method_invocation.adoc │ │ ├── 05_return_statement.adoc │ │ ├── 06_local_variable.adoc │ │ ├── 07_value_return.adoc │ │ ├── 08_parameter.adoc │ │ ├── 09_parameter_declaration.adoc │ │ ├── 10_parameter_passing.adoc │ │ ├── 11_pass_by_value.adoc │ │ ├── 12_variant_parameter.adoc │ │ ├── 13_recursive.adoc │ │ ├── 14_method_overloading.adoc │ │ ├── 15_definition.adoc │ │ ├── 16_method_signature.adoc │ │ ├── 17_using_overloaded_method.adoc │ │ ├── 18_lab_5-1.adoc │ │ ├── 19_lab_5-2.adoc │ │ ├── 20_review.adoc │ │ └── images │ │ │ ├── image01.png │ │ │ ├── image02.png │ │ │ ├── image03.png │ │ │ ├── image04.png │ │ │ ├── image05.png │ │ │ └── image06.png │ └── readme.adoc ├── Module06_array │ ├── .DS_Store │ ├── LabFile │ │ └── Lab6-1.zip │ ├── contents │ │ ├── 01_array.adoc │ │ ├── 02_overview_array.adoc │ │ ├── 03_whatisarray.adoc │ │ ├── 04_array_in_java.adoc │ │ ├── 05_dimension.adoc │ │ ├── 06_array_element_access.adoc │ │ ├── 07_array_boundary.adoc │ │ ├── 08_array_collection.adoc │ │ ├── 09_array_creation.adoc │ │ ├── 10_create_array_instance.adoc │ │ ├── 11_initiate_element.adoc │ │ ├── 12_initiate_mutiple_dimension.adoc │ │ ├── 13_jagged_array.adoc │ │ ├── 14_calcuated_length_array.adoc │ │ ├── 15_copy_array_elements.adoc │ │ ├── 16_using_array.adoc │ │ ├── 17_size_of_array.adoc │ │ ├── 18_method_of_array.adoc │ │ ├── 19_return_array.adoc │ │ ├── 20_array_as_parameter.adoc │ │ ├── 21_command_argument.adoc │ │ ├── 22_demo_using_commandline_argument.adoc │ │ ├── 23_using_array_in_foreach.adoc │ │ ├── 24_lab_6-1.adoc │ │ ├── 25_review.adoc │ │ └── images │ │ │ ├── image01.png │ │ │ ├── image02.png │ │ │ ├── image03.png │ │ │ ├── image04.png │ │ │ ├── image05.png │ │ │ ├── image06.png │ │ │ ├── image07.png │ │ │ ├── image08.png │ │ │ ├── image09.png │ │ │ ├── image10.png │ │ │ ├── image11.png │ │ │ ├── image12.png │ │ │ ├── image13.png │ │ │ ├── image14.png │ │ │ ├── image15.png │ │ │ ├── image16.png │ │ │ └── image17.png │ ├── homework │ │ └── tictactoe.adoc │ └── readme.adoc ├── Module07_oop_basic │ ├── .DS_Store │ ├── LabFiles │ │ └── Lab7-1.zip │ ├── contents │ │ ├── 01_OOP_basic.adoc │ │ ├── 02_class_and_object.adoc │ │ ├── 03_class.adoc │ │ ├── 04_object.adoc │ │ ├── 05_abstraction.adoc │ │ ├── 06_encapsulation.adoc │ │ ├── 07_data_method.adoc │ │ ├── 08_visibility.adoc │ │ ├── 09_why_encapsulation.adoc │ │ ├── 10_object_data.adoc │ │ ├── 11_using_static_data.adoc │ │ ├── 12_java_and_OOP.adoc │ │ ├── 13_helloworld.adoc │ │ ├── 14_simple_class_definition.adoc │ │ ├── 15_instance.adoc │ │ ├── 16_this.adoc │ │ ├── 17_nested_class.adoc │ │ ├── 18_access_nested_class.adoc │ │ ├── 19_lab_7-1.adoc │ │ ├── 20_oo_system.adoc │ │ ├── 21_inheritance.adoc │ │ ├── 22_hier.adoc │ │ ├── 23_single_mult_inher.adoc │ │ ├── 24_polymorphism.adoc │ │ ├── 25_abstract_class.adoc │ │ ├── 26_interface.adoc │ │ ├── 27_early_late_binding.adoc │ │ ├── 28_review.adoc │ │ └── images │ │ │ ├── image01.png │ │ │ ├── image02.png │ │ │ ├── image03.png │ │ │ ├── image04.png │ │ │ ├── image05.png │ │ │ ├── image06.png │ │ │ ├── image07.png │ │ │ ├── image08.png │ │ │ ├── image09.png │ │ │ ├── image10.png │ │ │ ├── image11.png │ │ │ ├── image12.png │ │ │ ├── image13.png │ │ │ ├── image14.png │ │ │ └── image15.png │ └── readme.adoc ├── Module08_reference_type │ ├── LabFiles │ │ ├── Lab8-1.zip │ │ └── Lab8-2.zip │ ├── contents │ │ ├── 01_reference_type.adoc │ │ ├── 02_reference.adoc │ │ ├── 03_comparision.adoc │ │ ├── 04_declare_release.adoc │ │ ├── 05_ref_variable.adoc │ │ ├── 06_comparision.adoc │ │ ├── 07_same_ref.adoc │ │ ├── 08_ref_as_parameter.adoc │ │ ├── 09_enum.adoc │ │ ├── 10_declare_enum.adoc │ │ ├── 11_enum_value_compare.adoc │ │ ├── 12_enum_method.adoc │ │ ├── 13_enum_constructor.adoc │ │ ├── 14_common_ref_type.adoc │ │ ├── 15_exception_class.adoc │ │ ├── 16_string_class.adoc │ │ ├── 17_string_method_operator.adoc │ │ ├── 18_string_compariaion.adoc │ │ ├── 19_string_compare_operator.adoc │ │ ├── 20_object_hier.adoc │ │ ├── 21_object_type.adoc │ │ ├── 22_common_method.adoc │ │ ├── 23_java_package.adoc │ │ ├── 24_overview_java_package.adoc │ │ ├── 25_java_lang_package.adoc │ │ ├── 26_java_util_package.adoc │ │ ├── 27_java_io_package.adoc │ │ ├── 28_other_package.adoc │ │ ├── 29_lab_8-1.adoc │ │ ├── 30_type_casting.adoc │ │ ├── 31_wrapper_class.adoc │ │ ├── 32_boxing_unboxing.adoc │ │ ├── 33_super_sub_casting.adoc │ │ ├── 34_instanceof.adoc │ │ ├── 35_object_casting.adoc │ │ ├── 36_interface_casting.adoc │ │ ├── 37_lab_8-2.adoc │ │ ├── 38_review.adoc │ │ └── images │ │ │ ├── image01.png │ │ │ ├── image02.png │ │ │ ├── image03.png │ │ │ ├── image04.png │ │ │ ├── image05.png │ │ │ ├── image06.png │ │ │ ├── image07.png │ │ │ ├── image08.png │ │ │ ├── image09.png │ │ │ ├── image10.png │ │ │ ├── image11.png │ │ │ ├── image12.png │ │ │ └── image13.png │ └── readme.adoc ├── Module09_object_creation_deletion │ ├── LabFiles │ │ └── Lab9-1.zip │ ├── contents │ │ ├── 01_object_creation_destroy.adoc │ │ ├── 02_constructor.adoc │ │ ├── 03_object_creation.adoc │ │ ├── 04_using_default_constructor.adoc │ │ ├── 05_defailt_constructor_overriding.adoc │ │ ├── 06_constructor_overloadng.adoc │ │ ├── 07_initiate_data.adoc │ │ ├── 08_initializer_list.adoc │ │ ├── 09_declare_constant.adoc │ │ ├── 10_private_constructor.adoc │ │ ├── 11_static_constructor.adoc │ │ ├── 12_lab_9-1.adoc │ │ ├── 13_object_and_memory.adoc │ │ ├── 14_object_lifecycle.adoc │ │ ├── 15_object_and_scope.adoc │ │ ├── 16_garbage_collection.adoc │ │ └── 17_review.adoc │ └── readme.adoc ├── Module10_inheritance_in_java │ ├── LabFiles │ │ ├── Lab10-1.zip │ │ ├── Lab10-2.zip │ │ ├── Lab10-3.zip │ │ └── Lab10-A.zip │ ├── contents │ │ ├── 01_inheritance_in_java.adoc │ │ ├── 02_write_subclass.adoc │ │ ├── 03_access_control_in_java.adoc │ │ ├── 04_class_extension.adoc │ │ ├── 05_access_to_supermembers.adoc │ │ ├── 06_invoke_constructorofsuper.adoc │ │ ├── 07_method_implementation.adoc │ │ ├── 08_virtual_method.adoc │ │ ├── 09_method_overriding.adoc │ │ ├── 10_final_method.adoc │ │ ├── 11_final_class.adoc │ │ ├── 12_interface.adoc │ │ ├── 13_define_interface.adoc │ │ ├── 14_multiple_interface_implemenatation.adoc │ │ ├── 15_implement_interface_method.adoc │ │ ├── 16_methods_in_interface.adoc │ │ ├── 17_static_method_in_interface.adoc │ │ ├── 18_abstract_class.adoc │ │ ├── 19_declare_abstract_class.adoc │ │ ├── 20_abstract_in_hier.adoc │ │ ├── 21_abstract_in_hier2.adoc │ │ ├── 22_abstract_interface.adoc │ │ ├── 23_implements_abstract.adoc │ │ ├── 24_lab_10-1.adoc │ │ ├── 25_lab_10-2.adoc │ │ ├── 26_lab_10-3.adoc │ │ ├── 27_review.adoc │ │ └── images │ │ │ ├── image01.png │ │ │ ├── image02.png │ │ │ ├── image03.png │ │ │ └── image04.png │ ├── homework │ │ ├── 1_starcraft.adoc │ │ ├── 2_poker.adoc │ │ ├── 3_colortokenizer.adoc │ │ └── images │ │ │ ├── image01.png │ │ │ ├── image02.png │ │ │ └── image03.png │ └── readme.adoc ├── Module11_generics │ ├── LabFile │ │ ├── Lab11-1.zip │ │ ├── Lab11-2.zip │ │ └── Lab11-A.zip │ ├── SampleCode │ │ ├── ArrayList.java │ │ ├── ArrayListEnumerator.java │ │ └── Rational.java │ ├── contents │ │ ├── 01_generics.adoc │ │ ├── 02_overview_generics.adoc │ │ ├── 03_generics_overview.adoc │ │ ├── 04_background.adoc │ │ ├── 05_pros_and_cons.adoc │ │ ├── 06_generics_collections.adoc │ │ ├── 07_basic.adoc │ │ ├── 08_syntax.adoc │ │ ├── 09_type_parameter.adoc │ │ ├── 10_multiple_type.adoc │ │ ├── 11_generic_class.adoc │ │ ├── 12_generic_method.adoc │ │ ├── 13_bordered_type.adoc │ │ ├── 14_extends_keyword.adoc │ │ ├── 15_multiple_bounds.adoc │ │ ├── 16_lab11-1.adoc │ │ ├── 17_type_safety.adoc │ │ ├── 18_type_check_compiletime.adoc │ │ ├── 19_avoiding_typecastring.adoc │ │ ├── 20_raw_type.adoc │ │ ├── 21_code_quality_improvement.adoc │ │ ├── 22_lab11-2.adoc │ │ ├── 23_advanced_topic.adoc │ │ ├── 24_wild_card.adoc │ │ ├── 25_covariance.adoc │ │ ├── 26_contravariance.adoc │ │ ├── 27_unlimited_wildcard.adoc │ │ ├── 28_type_erasure.adoc │ │ ├── 29_generics_compile.adoc │ │ ├── 30_inhertance_generics.adoc │ │ ├── 31_generic_class_inheritance.adoc │ │ └── 32_generic_method_overriding.adoc │ ├── images │ │ └── image01.png │ └── readme.adoc ├── Module12_lambda_expression │ ├── SampleCode │ │ ├── BinaryOp.java │ │ ├── Department.java │ │ ├── DepartmentTest.java │ │ ├── Member.java │ │ ├── MethodReference.java │ │ └── UnaryOp.java │ ├── contents │ │ ├── 01_Lambda.adoc │ │ ├── 02_overview_lambda.adoc │ │ ├── 03_overview.adoc │ │ ├── 04_lambda_java.adoc │ │ ├── 05_why_lambda.adoc │ │ ├── 06_functional_programming.adoc │ │ ├── 07_benefit.adoc │ │ ├── 08_basic.adoc │ │ ├── 09_syntax.adoc │ │ ├── 10_basic_structure.adoc │ │ ├── 11_functional_interface.adoc │ │ ├── 12_fi_in_library.adoc │ │ ├── 13_java_util_function.adoc │ │ ├── 14_built_in_fi.adoc │ │ ├── 15_bi_functional.adoc │ │ ├── 16_other_functional.adoc │ │ ├── 17_usage.adoc │ │ ├── 18_collection_stream.adoc │ │ ├── 19_method_ctor.adoc │ │ ├── 20_custom.adoc │ │ ├── 21_advanced_topic.adoc │ │ ├── 22_high_order_function.adoc │ │ ├── 23_closure.adoc │ │ ├── 24_curring.adoc │ │ ├── 25_recursive_lambda.adoc │ │ ├── 26_method_reference.adoc │ │ ├── 27_performance.adoc │ │ ├── 28_composition.adoc │ │ ├── 29_exception.adoc │ │ └── images │ │ │ ├── image01.png │ │ │ ├── image02.png │ │ │ ├── image03.png │ │ │ ├── image04.png │ │ │ ├── image05.png │ │ │ └── image06.png │ └── readme.adoc ├── Module13_annotation │ ├── LabFile │ │ ├── Lab13-1.zip │ │ └── Lab13-2.zip │ ├── contents │ │ ├── 01_annotation.adoc │ │ ├── 02_chapter1_annotation.adoc │ │ ├── 03_whatis_annotation.adoc │ │ ├── 04_why_annotation.adoc │ │ ├── 05_aop_annotation.adoc │ │ ├── 06_declare.adoc │ │ ├── 07_chapter2_target.adoc │ │ ├── 08_decl.adoc │ │ ├── 09_impl.adoc │ │ ├── 10_chapter3_standard.adoc │ │ ├── 11_deprecated.adoc │ │ ├── 12_override.adoc │ │ ├── 13_supresswarning.adoc │ │ ├── 14_safevarags.adoc │ │ ├── 15_functionalinterface.adoc │ │ ├── 16_lab13-1.adoc │ │ ├── 17_chapter4_meta_annotation.adoc │ │ ├── 18_retention.adoc │ │ ├── 19_documented.adoc │ │ ├── 20_target.adoc │ │ ├── 21_inherited.adoc │ │ ├── 22_repeatable.adoc │ │ ├── 23_chapter5_define_type.adoc │ │ ├── 24_type_creation.adoc │ │ └── 25_lab13-2.adoc │ ├── images │ │ ├── image01.png │ │ └── image02.png │ └── readme.adoc ├── Module14_collections_framework │ ├── Lab 14-1 │ │ ├── Solution │ │ │ ├── DesendingOrder.java │ │ │ ├── Test.java │ │ │ ├── User.java │ │ │ └── Users.java │ │ └── Starter │ │ │ ├── DesendingOrder.java │ │ │ ├── Test.java │ │ │ ├── User.java │ │ │ └── Users.java │ ├── contents │ │ ├── 00_collections_framework.adoc │ │ ├── 01_chapter1_collections_framework.adoc │ │ ├── 02_introduction_collection.adoc │ │ ├── 03_java_collections_framework.adoc │ │ ├── 04_collection_stored_structure.adoc │ │ ├── 05_java_collections_framework_org.adoc │ │ ├── 06_collection_interface.adoc │ │ ├── 07_collection_interface_methods.adoc │ │ ├── 08_chapter2_iterator_comparable_comparator.adoc │ │ ├── 09_iterable_iterator.adoc │ │ ├── 10_comparable.adoc │ │ ├── 11_comparator.adoc │ │ ├── 12_lab14-1.adoc │ │ ├── 13_chapter3_list.adoc │ │ ├── 14_list_interface.adoc │ │ ├── 15_arraylist.adoc │ │ ├── 16_linkedlist.adoc │ │ ├── 17_queue_interface.adoc │ │ ├── 18_vector.adoc │ │ ├── 19_stack.adoc │ │ ├── 20_chapter4_set.adoc │ │ ├── 21_set_interface.adoc │ │ ├── 22_hashset.adoc │ │ ├── 23_treeset.adoc │ │ ├── 24_chapter5_map.adoc │ │ ├── 25_map_interface.adoc │ │ ├── 26_hashmap.adoc │ │ ├── 27_hashtable.adoc │ │ ├── 28_treemap.adoc │ │ ├── 29_chapter6_collections_class.adoc │ │ ├── 30_collections_overview.adoc │ │ ├── 31_collections_concurrency_control.adoc │ │ ├── 32_readonly_collection.adoc │ │ ├── 33_checked_collection.adoc │ │ └── 34_review.adoc │ ├── homework_1 │ │ ├── dictionary.adoc │ │ └── words.txt │ ├── homework_2 │ │ └── prototypereopsitory.adoc │ ├── images │ │ ├── image01.png │ │ ├── image02.png │ │ ├── image03.png │ │ ├── image04.png │ │ ├── image05.png │ │ ├── image06.png │ │ ├── image07.png │ │ ├── image08.png │ │ ├── image09.png │ │ ├── image10.png │ │ ├── image11.png │ │ ├── image12.png │ │ ├── image13.png │ │ ├── image14.png │ │ ├── image15.png │ │ ├── image16.png │ │ └── image17.png │ ├── labfiles │ │ ├── lab14-1a.zip │ │ ├── lab14-1b.zip │ │ └── lab14-3b.zip │ ├── readme.adoc │ └── test │ │ └── calcurator.adoc ├── Module15_stream │ ├── contents │ │ ├── 00_introduction.adoc │ │ ├── 01-1_introduction_to_stream.adoc │ │ ├── 01-2_concept.adoc │ │ ├── 01-3_characteristic.adoc │ │ ├── 01-4_stream_collection.adoc │ │ ├── 01-5_streamapi_benefit.adoc │ │ ├── 02-1_usage.adoc │ │ ├── 02-2_stream_from_collection.adoc │ │ ├── 02-3_stream_from_array.adoc │ │ ├── 02-4_stream_from_file.adoc │ │ ├── 02-5_stream_from_iterable.adoc │ │ ├── 02-6_stream_builder.adoc │ │ ├── 02-7_how_stream_works.adoc │ │ ├── 02-8_stream_lifecycle.adoc │ │ ├── 03-1_intermediate_operations.adoc │ │ ├── 03-2_concept.adoc │ │ ├── 03-3_filtering.adoc │ │ ├── 03-4_mapping.adoc │ │ ├── 03-5_sorting.adoc │ │ ├── 03-6_limit_skip.adoc │ │ ├── 04-1_terminal_operation.adoc │ │ ├── 04-2_concept.adoc │ │ ├── 04-3_consume.adoc │ │ ├── 04-4_aggregation.adoc │ │ ├── 04-5_collection_transfer.adoc │ │ ├── 04-6_matching.adoc │ │ └── 04-7_find.adoc │ └── readme.adoc ├── Module16_thread │ ├── contents │ │ ├── 00_introduction.adoc │ │ ├── 01-1_basic_unix_commands.adoc │ │ ├── 01-2_directory_folder.adoc │ │ ├── 01-3_unix_directory.adoc │ │ ├── 01-4_basic_commands.adoc │ │ ├── 01-5_standard_stream.adoc │ │ ├── 01-6_pipe.adoc │ │ ├── 01-7_io_redirection.adoc │ │ ├── 02-10_process_scheduleing.adoc │ │ ├── 02-1_process.adoc │ │ ├── 02-2_introduction_process.adoc │ │ ├── 02-3_process.adoc │ │ ├── 02-4_process_status.adoc │ │ ├── 02-5_process_control_block.adoc │ │ ├── 02-6_process_communication.adoc │ │ ├── 02-7_sleep_wakeup.adoc │ │ ├── 02-8_producer_consumer.adoc │ │ ├── 02-9_dining.adoc │ │ ├── 03-1_thread.adoc │ │ ├── 03-2_introduction_thread.adoc │ │ ├── 03-3_process_thread.adoc │ │ ├── 03-4_thread_benefit.adoc │ │ ├── 04-1_java_thread_programming.adoc │ │ ├── 04-2_main_thread.adoc │ │ ├── 04-3_thread_creation_and_run.adoc │ │ ├── 04-4_multi_thread_priority.adoc │ │ ├── 04-5_thread_concurrency_control.adoc │ │ ├── 04-6_thread_status_changes.adoc │ │ └── 04-lab17-1.adoc │ ├── images │ │ ├── image01.png │ │ ├── image02.png │ │ ├── image03.png │ │ ├── image04.png │ │ ├── image05.png │ │ ├── image06.png │ │ ├── image07.png │ │ ├── image08.png │ │ ├── image09.png │ │ ├── image10.png │ │ ├── image11.gif │ │ ├── image12.png │ │ ├── image13.png │ │ ├── image14.png │ │ └── image15.png │ └── readme.adoc └── readme.adoc └── readme.adoc /.gitingore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .vscode/ -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "asciidoc.antora.enableAntoraSupport": true 3 | } -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/01_overview_java.adoc: -------------------------------------------------------------------------------- 1 | = Module 01: Java 개요 2 | 3 | 이 장에서는 Java 소프트웨어 플랫폼의 개요로 시작하여 Java 프로그래밍 언어, 실행 환경과 Java 가상 머신을 소개하고 Java의 디자인 목표와 언어 지원에 대해 설명합니다. Java의 역사와 여러 JDK 공급자, 다양한 Java 환경에 대해 설명하며, Java 프로그래밍 환경을 구성하는 방법에 대해 실습합니다. 4 | 5 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 6 | 7 | • Java 소프트웨어 플랫폼을 설명할 수 있습니다. 8 | • Java 소프트웨어 플랫폼을 구성하는 요소들에 대해 알게 됩니다. 9 | • Java 실행 환경, 개발 환경을 구분하고 각 환경을 구성하는 구성 요소들에 대해 알게 됩니다. 10 | • Java 계열 프로그래밍 언어와 각 실행 환경에 대해 설명할 수 있습니다. 11 | • Java 프로그래밍 환경과 실행 환경을 구성할 수 있습니다. 12 | 13 | == Table of contents 14 | 15 | 1. link:./02_introduction_java_platform.adoc[Java 소프트웨어 플랫폼 소개] 16 | 2. link:./06_java_virtual_machine.adoc[Java 가상 머신] 17 | 3. link:./11_history_java.adoc[Java의 역사] 18 | 19 | --- 20 | 21 | link:./02_introduction_java_platform.adoc[다음: Java 소프트웨어 플랫폼 소개] -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/02_introduction_java_platform.adoc: -------------------------------------------------------------------------------- 1 | = Java 소프트웨어 플랫폼 소개 2 | 3 | Java는 단순히 프로그래밍 언어의 이름으로 사용되는 경우가 많지만, 보다 넓은 의미로 Java 프로그래밍 언어로 작성된 프로그램을 개발하고 실행할 수 있는 플랫폼의 총칭으로 사용됩니다. 이 장에서는 Java 소프트웨어 플랫폼에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03_java_software_platform.adoc[Java 소프트웨어 플랫폼] 8 | 2. link:./04_java_programming_language.adoc[Java 프로그래밍 언어 소개] 9 | 3. link:./05_write_once_run_anywhere.adoc[Write Once Run Anywhere] 10 | 11 | --- 12 | 13 | link:./01_overview_java.adoc[이전: Java 개요] + 14 | link:./03_java_software_platform.adoc[다음: Java 소프트웨어 플랫폼] -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/05_write_once_run_anywhere.adoc: -------------------------------------------------------------------------------- 1 | = Write Once Run Anywhere 2 | 3 | image:./images/image06.png[] 4 | 5 | --- 6 | 7 | `Write Once Run Anywhere(WORA)` 또는 `Write Once, Run Everywhere(WORE)` Java의 크로스 플랫폼에 의해 얻을 수 있는 이점을 한마디로 표현할 수 있는 표어입니다. 이는 Java가 어떤 장비에서도 개발될 수 있고, 표준 바이트코드로 컴파일되고, Java 가상 머신이 장착된 장비라면 어디에서도 실행될 수 있음을 의미합니다. 8 | 9 | Java 프로그래밍 언어로 작성된 소스코드는 Java 컴파일러를 통해 `Java 바이트코드(.class)` 컴파일되며, 바이트코드는 Java 가상 머신 상에서 실행됩니다. 이런 구조가 Write Once Run Anywhere를 가능하도록 만듭니다. 10 | 11 | --- 12 | 13 | link:./04_java_programming_language.adoc[이전: Java 프로그래밍 언어] + 14 | link:./06_java_virtual_machine.adoc[다음: Java 가상 머신] -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/06_java_virtual_machine.adoc: -------------------------------------------------------------------------------- 1 | = Java 가상 머신 2 | 3 | Java 가상 머신은 Java 바이트코드를 실행하는 실행하는 가상 머신이며, 인터프리터나 JIT 컴파일 방식으로 다른 컴퓨터에서 바이트코드를 실행하도록 구현된 Java의 실행 환경이자 개발 환경입니다. 이 장에서는 Java 가상 머신에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./07_overview_java_virtual_machine.adoc[Java 가상 머신] 8 | 2. link:./08_java_operation_principle.adoc[Java 동작 원리] 9 | 3. link:./09_jdk_jre.adoc[JDK와 JRE] 10 | 4. link:./10_jvm_language.adoc[JVM 언어] 11 | 12 | --- 13 | 14 | link:./05_write_once_run_anywher.adoc[이전: Write Once Run Anywhere] + 15 | link:./07_overview_java_virtual_machine.adoc[다음: Java 가상 머신 개요] 16 | -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/08_java_operation_principle.adoc: -------------------------------------------------------------------------------- 1 | = Java 동작 원리 2 | 3 | image:./images/image08.png[] 4 | 5 | --- 6 | 7 | Java 실행 엔진의 동작 방식은 Java 가상 머신의 구현에 따라 다릅니다. Oracle의 Hotspot의 경우에는 아래와 같이 동작합니다. 8 | 9 | * 일반적으로 인터프리터가 프로그램을 시작하는데 사용됩니다. 10 | * Java 가상 머신은 성능 향상을 위해 코드의 성능에 중요한 부분을 컴파일하지만 거의 사용되지 않는 코드는 컴파일하지 않습니다. 11 | * 코드를 컴파일하는 방법을 최적화하기 위해 라인별 adaptive compiler를 사용합니다. 12 | 13 | Java 가상 머신은 라인별로 바이트 코드를 읽어 기계어로 변환해 실행하며 기본적으로는 인터프리터를 통해 실행을 하지만 자주 등장하는 바이트 코드일 경우 JIT 컴파일러로 컴파일하는 방법을 통해 실행 방법을 최적화합니다. 14 | 15 | == 인터프리터 16 | 바이트 코드를 하나씩 읽어서 해석하고 실행합니다. 한 줄 단위로 읽어서 해석하고 실행하기 때문에 바이트 코드 단위의 해석은 빠른 대신 인터프리팅 결과의 실행은 느리다는 단점을 가집니다. 바이트 코드는 기본적으로 인터프리터 방식으로 동작합니다. 17 | 18 | == JIT(Just-In-Time) 컴파일러 19 | 인터프리터의 단점을 보완하기 위해 도입되었으며, 인터프리터 방식으로 동작하다가 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브 코드로 변경하고, 해당 메소드를 더 이상 인터프리팅 하지 않고 네이티브 코드로 직접 실행합니다. 네이티브 코드를 실행하는 것이 인터프리팅보다 빠르고, 네이티브 코드는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 계속 빠르게 실행됩니다. 20 | 21 | --- 22 | 23 | link:./07_overview_java_virtual_machine.adoc[이전: Java 가상 머신 개요] + 24 | link:./09_jdk_jre.adoc[다음: JDK와 JRE] 25 | 26 | -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/11_history_java.adoc: -------------------------------------------------------------------------------- 1 | = Java의 역사 2 | 3 | Java는 오픈소스와 상용 버전이 섞여 있으며 다양한 라이선스와 배포 형태를 가지고 있습니다. 이 장에서는 Java의 라이선스와 다양한 JVM 공급자를 이해하기 위해 Java의 역사에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./12_history_java_2.adoc[Java의 역사] 8 | 2. link:./13_jdk_provider.adoc[JVM 언어] 9 | 10 | --- 11 | 12 | link:./10_jvm_language.adoc[이전: JVM 언어] + 13 | link:./12_history_java_2.adoc[다음: Java의 역사] -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module01_java_overview/contents/images/image01.png -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module01_java_overview/contents/images/image02.png -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module01_java_overview/contents/images/image03.png -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module01_java_overview/contents/images/image04.png -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module01_java_overview/contents/images/image05.png -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module01_java_overview/contents/images/image06.png -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module01_java_overview/contents/images/image07.png -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module01_java_overview/contents/images/image08.png -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/images/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module01_java_overview/contents/images/image09.png -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module01_java_overview/contents/images/image10.png -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/images/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module01_java_overview/contents/images/image11.png -------------------------------------------------------------------------------- /course/Module01_java_overview/contents/images/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module01_java_overview/contents/images/image12.png -------------------------------------------------------------------------------- /course/Module01_java_overview/readme.adoc: -------------------------------------------------------------------------------- 1 | = Module 01 Java 개요 2 | 3 | link:./contents/01_overview_java.adoc[Module 01: Java 개요] 4 | 5 | * link:./contents/02_introduction_java_platform.adoc[Chapter 1: Java 소프트웨어 플랫폼 소개] 6 | ** link:./contents/03_java_software_platform.adoc[Java 소프트웨어 플랫폼] 7 | ** link:./contents/04_java_programming_language.adoc[Java 프로그래밍 언어] 8 | ** link:./contents/05_write_once_run_anywhere.adoc[Write Once Run Anywhere] 9 | * link:./contents/06_java_virtual_machine.adoc[Chapter 2: Java 가상 머신] 10 | ** link:./contents/07_overview_java_virtual_machine.adoc[Java 가상 머신 개요] 11 | ** link:./contents/08_java_operation_principle.adoc[Java 동작 원리] 12 | ** link:./contents/09_jdk_jre.adoc[JDK와 JRE] 13 | ** link:./contents/10_jvm_language.adoc[JVM 언어] 14 | * link:./contents/11_history_java.adoc[Chapter 3: Java의 역사] 15 | ** link:./contents/12_history_java_2.adoc[Java의 역사] 16 | ** link:./contents/13_jdk_provider.adoc[JDK 공급자] 17 | * link:./contents/14_lab1-1.adoc[연습: Lab 1-1 Java 실행 환경 구성] 18 | * link:./contents/15_lab1-2.adoc[연습: Lab 1-2 개발 환경 설치] 19 | -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/LabFile/Lab02.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/LabFile/Lab02.zip -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/01_Java_language.adoc: -------------------------------------------------------------------------------- 1 | = Module 02: Java 프로그래밍 언어 개요 2 | 3 | 이 모듈에서는 간단한 예제를 분석하여 Java 프로그램의 기본 구조에 대해 배웁니다. System 클래스를 사용하여 몇 가지 기본 입력 및 출력 작업을 수행하는 방법을 학습하며, 오류를 처리하고 코드를 문서화하기 위한 몇 가지 모범 사례에 대해 학습합니다. Java 프로그램을 컴파일하고 실행하는 방법 또한 학습합니다. 4 | 5 | 이 모듈을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 6 | 7 | • 간단한 Java 응용 프로그램의 구조에 대해 알게 됩니다. 8 | • java.lang 패키지의 System 클래스를 사용하여 기본 입/출력 동작을 수행합니다. 9 | • Java 프로그램에서 예외를 처리할 수 있게 됩니다. 10 | • Java로 작성된 코드의 자동화된 문서 작성을 할 수 있습니다. 11 | • Java 프로그램을 컴파일하고 실행합니다. 12 | • 개발 환경에서 Java 프로그램을 디버깅 합니다. 13 | 14 | == Table of Contents 15 | 16 | 1. link:./02_java_program_structure.adoc[Java 프로그램 구조] 17 | 2. link:./08_basic_inputout.adoc[기초적인 입/출력 동작] 18 | 3. link:./12_recommandations.adoc[권장사항] 19 | 4. link:./17_compile_run_debug.adoc[컴파일, 디버깅, 실행] 20 | 21 | --- 22 | 23 | link:./02_java_program_structure.adoc[다음: Java 프로그램 구조] -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/02_java_program_structure.adoc: -------------------------------------------------------------------------------- 1 | = Java 프로그램 구조 2 | 3 | 이 단원에서는 Java 프로그램의 기본 구조에 대해 알아봅니다. Java 프로그램의 필수 기능을 포함하는 간단한 응용 프로그램을 분석하며, 개발 도구를 사용하여 Java 프로그램을 만들고 편집하는 방법을 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03_hello_world.adoc[Hello, World] 8 | 2. link:./04_class.adoc[클래스] 9 | 3. link:./05_main_method.adoc[main 메소드] 10 | 4. link:./06_java_langa_package.adoc[import 지시문과 java.lang 패키지] 11 | 12 | --- 13 | 14 | link:./01_Java_language.adoc[이전: Java 프로그래밍 언어 개요] + 15 | link:./03_hello_world.adoc[다음: Hello, World!] -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/04_class.adoc: -------------------------------------------------------------------------------- 1 | = Class 2 | 3 | * Java 프로그램은 클래스, 인터페이스, 열거형 및 기타 형식의 집합 4 | * Class는 데이터와 메소드들의 집합 5 | 6 | [source, java] 7 | ---- 8 | class name { 9 | … 10 | } 11 | ---- 12 | 13 | * Java 프로그램은 여러 개의 파일로 구성 가능 14 | * 하나의 class는 여러 파일에 나뉘어 존재할 수 없음 15 | * 하나의 파일에는 여러 클래스가 존재할 수 있으나, public class는 하나만 존재해야 함 16 | * 파일의 이름과 public class의 이름은 동일해야 함 17 | 18 | --- 19 | 20 | Java에서 응용 프로그램은 하나 이상의 클래스, 인터페이스, 열거형 및 기타 형식의 집합입니다. 뒤 모듈들에서 상세히 다룰 객체지향 프로그래밍 개념을 빼고 이야기하면, 클래스는 해당 데이터를 조작할 수 있는 메소드와 결합된 데이터의 집합으로 생각할 수 있습니다. 21 | 22 | Hello, World 프로그램의 코드를 보면. 23 | 24 | [source, java] 25 | ---- 26 | public class Hello 27 | { 28 | public static void main(String[] args) 29 | { 30 | System.out.println(“Hello, World!”); 31 | } 32 | } 33 | ---- 34 | 35 | Java에서 클래스는 class 키워드를 사용하여 정의합니다. 클래스 이름 뒤에는 여는 중괄호 ( { )가 있으며 닫는 중괄호 ( } )가 나오기 전 까지의 모든 항목은 클래스의 일부로 정의됩니다. 36 | 37 | Java에서는 클래스를 하나 이상의 파일에 분산할 수 없습니다. 한 파일에 여러 클래스가 존재할 수는 있으나, 단일 클래스를 여러 파일로 확장할 수는 없습니다. 38 | 한 파일에 public class는 하나만 존재해야 하며, 파일의 이름과 public class의 이름은 동일하도록 작성해야 합니다. 39 | 40 | --- 41 | 42 | link:./03_hello_world.adoc[이전: Hello, World!] + 43 | link:./05_main_method.adoc[다음: main 메소드] -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/05_main_method.adoc: -------------------------------------------------------------------------------- 1 | = main 메소드 2 | 3 | * 응용 프로그램 진입점, Application Entry Point 4 | * Java의 main 메소드 정의 규칙 5 | ** 메소드 이름의 모든 문자는 소문자(lowercase)로, “main”과 같이 정의 6 | ** String 타입 배열 args를 인자로 선언 7 | ** public static void main(String[] args)와 같이 선언 8 | * 여러 개의 클래스가 main 메소드를 가질 수 있음 9 | * main 메소드가 종료되거나 return하면 프로그램이 종료됨 10 | 11 | --- 12 | 13 | 응용 프로그램이 시작되는 곳을 응용 프로그램 진입점(Application Entry Point)라고 합니다. 모든 응용 프로그램은 시작되는 곳이 있어야 하며, Java 프로그램은 클래스에 선언된 main 메소드에서 시작됩니다. C, C++, C#등 Java와 유사한 컨셉을 가진 프로그래밍 언어로 작성된 프로그램은 이와 유사하게 실행됩니다. 14 | 15 | > 중요 Java는 대소문자를 구분합니다. main의 모든 문자는 소문자로 쓰여야 합니다. 16 | 17 | Java 프로그램에는 여러 클래스가 있을 수 있지만 프로그램이 시작하는 지점은 하나만 있을 수 있습니다. 동일한 프로그램에는 많은 `class` 가 있을 수 있고 각 클래스는 `main` 을 가질 수 있지만 응용 프로그램의 시작한 하나의 `main` 에서 시작됩니다. 18 | 19 | `main` 의 생김새도 중요합니다. `main` 은 `static void` 로 선언되고 `String` 타입의 배열 `args` 를 인자로 가져야 합니다. 20 | 21 | Java 프로그램은 `main` 이 끝까지 실행되거나 `return` 문이 실행될 때까지 실행됩니다. 22 | 23 | --- 24 | 25 | link:./04_class.adoc[이전: Class] + 26 | link:./06_java_langa_package.adoc[다음: import 지시문과 java.lang 패키지] -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/08_basic_inputout.adoc: -------------------------------------------------------------------------------- 1 | = 기초적인 입/출력 동작 2 | 3 | 이 단원에서는 Java에서 System 클래스를 사용해 명령어 기반 입/출력을 수행하는 것을 배웁니다. print 메소드와 println 메소드를 사용하여 정보를 화면에 출력하는 방법과 Scanner 클래스를 사용하여 콘솔 기반에서 값을 받아들이는 것을 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./09_systemclass.adoc[System 클래스] 8 | 2. link:./10_standard_output.adoc[표준 출력] 9 | 3. link:./11_scanner_class.adoc[Scanner 클래스] 10 | 11 | --- 12 | 13 | link:./07_demo.adoc[이전: 데모 - Java 프로그램 컴파일 및 실행] + 14 | link:./09_systemclass.adoc[다음: 시스템 클래스] -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/12_recommandations.adoc: -------------------------------------------------------------------------------- 1 | = 권장 사항 2 | 3 | 이 단원에서는 Java 응용 프로그램을 작성할 때 사용할 몇 가지 권장 사례를 학습합니다. 가독성과 유지 관리를 돕기 위해 코드에 주석을 추가하는 방법을 보여주며, 응용 프로그램 문서를 작성하는 방법과 응용 프로그램이 실행될 때 발생할 수 있는 오류를 추가하는 방법을 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./13_comments.adoc[주석] 8 | 2. link:./14_javadoc.adoc[Javadoc] 9 | 3. link:./15_exception.adoc[예외 처리] 10 | 11 | --- 12 | 13 | link:./11_scanner_class.adoc[이전: Scanner 클래스] + 14 | link:./13_comments.adoc[다음: 주석] -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/17_compile_run_debug.adoc: -------------------------------------------------------------------------------- 1 | = 컴파일, 실행, 디버깅 2 | 3 | 이 단원에서는 터미널과 개발 도구에서 Java 프로그램을 컴파일하고 디버그 하는 방법을 배웁니다. 몇 가지 컴파일러 옵션을 알아보며, IntelliJ 통합 개발 환경에서 디버거를 사용하여 응용 프로그램을 디버깅 하는 방법을 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./18_invoking_compiler.adoc[컴파일러 호출] 8 | 2. link:./19_run_java_program.adoc[응용 프로그램 실행] 9 | 3. link:./20_debugging.adoc[디버깅] 10 | 4. link:./21_jdk_tools.adoc[JDK 도구] 11 | 12 | --- 13 | 14 | link:./16_demo2.adoc[이전: Demo - JavaDoc을 사용한 HTML 문서 생성] + 15 | link:./18_invoking_compiler.adoc[다음: 컴파일러 호출] 16 | -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/19_run_java_program.adoc: -------------------------------------------------------------------------------- 1 | = Java 프로그램 실행 2 | 3 | * 명령 줄에서 Java 프로그램 실행 4 | * java 명령어 로 컴파일된 클래스를 호출 5 | 6 | ---- 7 | $ java 8 | ---- 9 | 10 | * 개발 환경에서 Java 프로그램 실행 11 | * 각 개발 환경의 실행/디버깅 방법에 따름 12 | 13 | --- 14 | 15 | 컴파일 된 Java 응용 프로그램은 java 명령을 사용하여 실행할 수 있습니다. 16 | 17 | == 명령 줄에서 실행 18 | 19 | 응용 프로그램이 성공적으로 컴파일 되면, 바이트 코드로 구성된 .class 파일이 생성됩니다. 응용 프로그램에 여러 클래스나 인터페이스가 있으면, 모든 클래스나 인터페이스가 개별 .class 파일로 생성됩니다. 생성된 바이트 코드를 실행하기 위해서는 아래와 같이 java 명령을 호출합니다. 20 | 21 | ---- 22 | > java <.class 파일> 23 | ---- 24 | 25 | == 개발 환경에서 Java 프로그램 실행 26 | Java 응용 프로그램을 개발하는 많은 개발 환경은 환경 내에서 응용 프로그램을 컴파일하고 실행할 수 있는 기능을 제공합니다. 27 | 28 | 예를 들어, IntelliJ 통합 개발 환경에서는 아래와 같이 프로젝트 단위로 생성된 응용 프로그램을 실행합니다. 29 | 30 | image:./images/image17.png[] 31 | 32 | --- 33 | 34 | link:./18_invoking_compiler.adoc[이전: 컴파일러 호출] + 35 | link:./20_debugging.adoc[다음: 디버깅] 36 | 37 | -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/20_debugging.adoc: -------------------------------------------------------------------------------- 1 | = 디버깅 2 | 3 | * JIT(Just-In-Time) 디버깅 4 | * 개발 환경에서 디버깅 5 | * 중단점(Breakpoints)를 사용하여 실행 정보 확인 6 | * 코드를 단계별로 실행 7 | * 변수를 평가하고 수정 8 | 9 | --- 10 | 11 | 디버그는 프로그래밍 과정중에 발생하는 오류나 비 정상적인 연산을 찾고 수정하는 것입니다. 이 과정을 디버깅이라고 부릅니다. 12 | 13 | == JIT 디버깅 14 | 응용 프로그램에서 예외가 발생하고 이를 처리할 수 있는 코드를 작성하지 않은 경우 JVM이 JIT 디버깅을 시작합니다. (JIT 컴파일러와 JIT 디버깅은 다릅니다) 디버깅은 주로 변수의 값을 추적하여 예측되는 올바른 값이 들어가 있는 것을 확인하는 것으로 시작합니다. Java 응용 프로그램을 컴파일 할 때 디버깅 정보를 추가하여 명령 줄에서 디버깅 할 수 있으나, 일반적으로 개발 환경에서 제공하는 기능을 사용하여 디버깅하며, 이는 생산성에 큰 도움이 됩니다. 15 | 16 | == Breakpoint 사용 17 | 18 | 만약 Visual Studio Code 또는 IntelliJ와 같은 개발 환경을 사용한다면, 개발 환경에 제공하는 디버거를 사용하여 시각적으로 확인할 수 있는 Breakpoint를 사용할 수 있습니다. 19 | 20 | 대부분의 개발 환경에서는 왼쪽 여백을 클릭하여 Breakpoint를 삽입할 수 있는 방법을 제공합니다. 디버그 모드에서 응용 프로그램을 실행하면 Breakpoint가 설정된 위치에서 실행이 멈추고, 변수에 할당되어 있는 값을 추적할 수 있으며 단계별로 실행하며 결과를 확인할 수 있습니다. 21 | 22 | --- 23 | 24 | link:./19_run_java_program.adoc[이전: Java 프로그램 실행] + 25 | link:./21_jdk_tools.adoc[다음: JDK 도구] -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/21_jdk_tools.adoc: -------------------------------------------------------------------------------- 1 | = JDK 도구 2 | 3 | * 일반적인 도구와 유틸리티 4 | 5 | [%header, cols="1,2,2"] 6 | |=== 7 | |도구 이름| 명령| 설명 8 | |jar| $ jar <옵션> <디렉터리 or 파일>| Java에서 사용되는 묶음인 jar 파일을 생성하고 관리합니다. 9 | |jps| $ jps| 현재 실행중인 Java 프로세스들의 이름과 프로세스 ID를 보여줍니다. 10 | |jmap| $ jmap <옵션> | JVM의 힙 메모리 상태를 확인합니다. 11 | |jhat| $ jhat <덤프 파일>| jmap을 사용하여 생성한 메모리 덤프 파일을 분석합니다. 12 | |=== 13 | 14 | --- 15 | 16 | JDK는 응용 프로그램 개발, 구성 및 배포를 위한 추가 기능을 제공하는 여러 도구를 제공합니다. 이 도구들은 명령 줄에서 실행할 수 있습니다. 17 | 18 | --- 19 | 20 | link:./20_debugging.adoc[이전: 디버깅] + 21 | link:./22_lab2-1.adoc[다음: Lab 2-1 간단한 Java 프로그램 작성] -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/23_lab2-2.adoc: -------------------------------------------------------------------------------- 1 | = Lab 2-2: 디버깅 2 | 3 | 이 연습에서는 Visual Studio Code를 사용하여 프로그램을 한 단계씩 실항하고 변수 값을 검사하여 디버깅 하는 작업을 연습합니다. 4 | 5 | == Visual Studio Code에서 Breakpointy를 지정하고 디버깅 시작 6 | 1. Visual Studio Code 에디터에 열려 있는 Greetings 클래스의 main 메소드에서, scanner를 생성하는 코드의 라인 번호 옆을 클릭하여 Breakpoint를 지정합니다. 7 | + 8 | image:./images/image22.png[image22, 500] 9 | + 10 | 2. 오른쪽 위, 화살표 옆의 ∨ 기호를 클릭하고 Debug Java를 클릭합니다. 11 | + 12 | image:./images/image23.png[image23, 350] 13 | + 14 | 3. 왼쪽의 실행 및 디버그 창에서, 변수를 확인합니다. 15 | + 16 | image:./images/image24.png[image24, 350] 17 | + 18 | 4. F10키를 눌러 다음 단계를 실행하고 실행 및 디버그 창에서, 변수를 확인합니다. 19 | + 20 | image:./images/image25.png[image25, 350] 21 | + 22 | 5. F10 키를 눌러 다음 단계를 실행하고, 터미널에서 이름을 입력하고 Enter 키를 누릅니다. 23 | + 24 | image:./images/image26.png[image26, 450] 25 | + 26 | 6. 실행 및 디버그 창에서 변수를 확인합니다. 27 | + 28 | image:./images/image27.png[image27, 350] 29 | + 30 | 7. F5 키를 눌러 프로그램 실행을 계속합니다. 터미널 창에서 실행이 완료된 것을 확인합니다. 31 | + 32 | image:./images/image28.png[image28, 450] 33 | 34 | --- 35 | 36 | link:./22_lab2-1.adoc[이전: Lab 2-1 간단한 Java 프로그램 작성] + 37 | link:./24_lab2-3.adoc[다음: Lab 2-3 예외 처리] -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image01.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image02.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image03.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image04.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image05.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image06.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image07.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image08.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image09.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image10.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image11.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image12.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image13.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image14.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image15.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image16.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image17.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image18.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image19.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image20.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image21.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image22.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image23.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image24.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image25.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image26.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image27.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image28.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image29.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image30.png -------------------------------------------------------------------------------- /course/Module02_Java_progrmming_language_overview/contents/images/image31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module02_Java_progrmming_language_overview/contents/images/image31.png -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module03_primitive_data_type/.DS_Store -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/00_introduction.adoc: -------------------------------------------------------------------------------- 1 | = Module 03: 기본 데이터 타입 2 | 3 | 애플리케이션 실행을 위해 사용하는 데이터를 변수(Variable)라는 임시 공간에 저장합니다. 이를 위해서는 데이터의 타입을 지정하여 변수를 선언하여 데이터가 저장될 저장소를 확보해야 합니다. 애플리케이션에서는 변수를 정의한 후 변수에 값을 할당하여 사용합니다. 4 | 5 | 이 모듈에서는 Java에서 기본 데이터 타입 타입 변수(Value Type)를 사용하는 방법을 학습합니다. 변수에 할당될 데이터 유형을 지정하는 방법, 변수에 이름을 붙이는 규칙, 변수에 값을 할당하는 방법 등을 배우며 기존 변수를 한 데이터 타입에서 다른 데이터 타입으로 변환하는 방법을 배웁니다. 6 | 7 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 8 | 9 | * Java 애플리케이션에서 사용하는 변수의 타입에 대해 설명할 수 있습니다. 10 | * Java에서 흔히 사용하는 이름 정의 규칙에 대해 알게 됩니다. 11 | * 기본 데이터 타입(Primitive Data Type) 변수를 선언하고 사용할 수 있습니다. 12 | * 값을 변수에 할당할 수 있습니다. 13 | * 기존 변수를 다른 타입으로 변환합니다. 14 | 15 | == 목차 16 | 17 | 1. link:./01-1_value_ref.adoc[값 타입과 참조 타입] 18 | 2. link:./02-1_variable_naming.adoc[변수 이름 붙이기] 19 | 3. link:./03-1_using_primitive_types.adoc[기본 데이터 타입 사용] 20 | 4. link:./04-1_type_casting.adoc[데이터 타입 변환] 21 | 22 | --- 23 | 24 | link:./01-1_value_ref.adoc[다음: 값 타입과 참조 타입] -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/01-1_value_ref.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 1: 값 타입과 참조 타입 2 | 3 | 모든 변수에는 변수에 저장할 값의 범위를 결정하는 타입이 지정됩니다. Java는 컴파일 시 변수에 저장된 값이 항상 적절한 형식임을 보장하는 type-safe한 언어입니다. 4 | 5 | 이 단원에서는 값 타입과 참조 타입에 대해 알아보고 값 타입 변수에 값을 저장할 수 있는 데이터 유형을 배웁니다. 6 | 7 | == Table of Contents 8 | 9 | 1. link:./01-2_valuetype_reftype.adoc[값 타입과 참조 타입] 10 | 2. link:./01-3_java_primitive_data_type.adoc[Java 데이터 타입] 11 | 3. link:./01-4_primitive_data_type.adoc[기본 데이터 타입] 12 | 13 | --- 14 | 15 | link:./00_introduction.adoc[이전: Module 03: 기본 데이터 타입] + 16 | link:./01-2_valuetype_reftype.adoc[다음: 값 타입과 참조 타입] -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/01-2_valuetype_reftype.adoc: -------------------------------------------------------------------------------- 1 | = 값 타입과 참조 타입 2 | 3 | * 값 타입(Value Type) 4 | ** 데이터를 직접 포함 5 | ** 복사된, 직접 가지는 데이터를 저장 6 | ** 한 연산이 다른 데이터에 영향을 미치지 않음 7 | ** 스택(Stack) 영역에 데이터 저장 8 | * 참조 타입(Reference Type) 9 | ** 데이터(객체)가 있는 곳의 위치를 저장 10 | ** 두 참조 타입 변수는 같은 객체를 가리킬 수 있음 11 | ** 한 연산이 다른 데이터에 영향을 끼칠 수 있음 12 | ** 힙(Heap)영역에 저장 13 | 14 | --- 15 | 16 | == 값 타입(Value Type) 17 | 18 | 값 타입 변수는 스택 영역에 저장되며, 해당 데이터가 직접 포함됩니다. 각 값 타입 변수에는 복사된 데이터가 존재하므로 한 변수에 대한 어떤 작업도 다른 변수에 영향을 미치지 않습니다. 19 | 20 | image:./images/image01.png[value type, 400] 21 | 22 | == 참조 타입(Reference Type) 23 | 24 | 참조 타입 변수에는 해당 데이터에 대한 참조가 포함됩니다. 참조 타입 변수에 대한 데이터는 변수가 존재하는 곳이 아닌 위치가 존재하는 다른 곳에 저장되고 변수는 그 데이터가 있는 곳(주소)를 가리킵니다. 두 개의 참조 타입 변수는 같은 개체를 가리킬 수 있으므로 한 참조 타입 변수에 대한 작업이 다른 변수에서 참조하는 개체에 영향을 미칠 수 있습니다. Java에서 모든 참조 타입은 `java.lang.Object` 의 서브 타입입니다. 25 | 26 | image:./images/image02.png[reference type, 400] 27 | 28 | --- 29 | 30 | link:./01-1_value_ref.adoc[이전: 값 타입과 참조 타입] + 31 | link:./01-3_java_primitive_data_type.adoc[다음: Java 기본 데이터 타입] -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/01-3_java_primitive_data_type.adoc: -------------------------------------------------------------------------------- 1 | = Java 데이터 타입 2 | 3 | * Java 에서는 기본 데이터 타입(Primitive Data Type = 값 타입)과 참조 타입을 지원 4 | 5 | image:./images/image03.png[] 6 | 7 | --- 8 | 9 | Java는 값을 저장하는 기본 데이터 타입(Primitive Data Type)과 주소를 저장하는 참조 타입(Reference Type) 두 가지 타입을 지원합니다. 10 | 11 | Java에서 기본 타입 변수는 실제 값(data)를 저장하는 반면, 참조 타입 변수는 어떤 값이 저장되어 있는 주소(memory address)를 저장합니다. Java는 C나 C++, C#등의 언어와 달리 참조 연산을 할 수 없으므로, Java에서 모든 값은 변수에 저장된 값(참조 타입의 경우 주소가 가리키는 곳이 아닌)으로 전달됩니다. 12 | 13 | --- 14 | 15 | link:./01-2_valuetype_reftype.adoc[이전: 값 타입과 참조 타입] + 16 | link:./01-4_primitive_data_type.adoc[다음: 기본 데이터 타입] -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/02-1_variable_naming.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 2: 변수 이름 붙이기 2 | 3 | 변수를 사용하기 전에, 먼저 변수에 대해 의미 있고 적절한 이름을 사용해야 합니다. 4 | 5 | 이 단원에서는 변수 이름을 지정할 때 사용하는 Java의 표준 이름 지정 규칙과 권고 사항, 변수 이름에 사용할 수 없는 Java에서 예약된 키워드에 대해 알아봅니다. 6 | 7 | == Table of Contents 8 | 9 | 1. link:./02-2_naming_rule.adoc[변수 명명 규칙] 10 | 2. link:./02-3_naming_recommandation.adoc[권장되는 변수 이름 짓기] 11 | 3. link:./02-4_java_keyword.adoc[Java 키워드] 12 | 13 | --- 14 | 15 | link:./01-4_primitive_data_type.adoc[이전: 기본 데이터 타입] + 16 | link:./02-2_naming_rule.adoc[다음: 변수 명명 규칙] -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/02-2_naming_rule.adoc: -------------------------------------------------------------------------------- 1 | = 변수 명명 규칙 2 | 3 | * 하나 이상의 글자로 이루어져야 함 4 | * 첫 번째 글자는 문자이거나, _(Underscore) 또는 '$' 이어야 함 5 | * 키워드는 사용할 수 없음 6 | 7 | --- 8 | 9 | Java에서 변수의 이름을 지정할 때는 아래 규칙에 따라야 합니다. 10 | 11 | * 변수는 문자 또는 _ (Underscore), '$'로 시작해야 합니다. 12 | * 첫 번째 문자 뒤에는 숫자, 문자, '_', '$'' 문자가 올 수 있습니다. 13 | * 예약된 키워드는 사용할 수 없습니다. 14 | * 규칙에 어긋나는 변수 이름을 쓰면 컴파일시에 오류가 발생합니다. 15 | 16 | --- 17 | 18 | link:./02-1_variable_naming.adoc[이전: 변수 이름 붙이기] + 19 | link:./02-3_naming_recommandation.adoc[다음: 권장되는 변수 이름 짓기] -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/02-3_naming_recommandation.adoc: -------------------------------------------------------------------------------- 1 | = 권장되는 변수 이름 짓기 2 | 3 | * 모든 변수 이름을 대문자로 쓰는 것을 피한다 4 | * 변수 이름이 _ (Underscore)로 시작되는 것을 피한다 5 | * 약어 사용을 피한다 6 | * 여러 단어로 이루어진 이름을 사용할 경우 Camel Casing을 사용한다. 7 | 8 | --- 9 | 10 | Java에서 변수의 이름을 지정할 때는 아래 규칙에 따라야 합니다. 11 | 12 | * 변수는 문자 또는 _ (Underscore), ‘$’로 시작해야 합니다. 13 | * 첫 번째 문자 뒤에는 숫자, 문자, ‘_’, ‘$’ 문자가 올 수 있습니다. 14 | * 예약된 키워드는 사용할 수 없습니다. 15 | * 규칙에 어긋나는 변수 이름을 쓰면 컴파일시에 오류가 발생합니다. 16 | 17 | == CamelCasing 명명 규칙 18 | 19 | 단봉 낙타 규칙이라고도 불리는 CamelCasing 명명 규칙은 변수 이름을 지정할 때 단어를 붙여 쓰되, 첫 문자는 소문자로 시작하고 두 번째 단어부터는 첫 글자가 대문자로 시작하도록 이름을 지정하는 방법입니다. 메소드, 지역 변수, 필드와 파라미터, 상수 등에 사용합니다. 20 | 21 | [source, java] 22 | ---- 23 | int productCount; 24 | void openDocument() { } 25 | ---- 26 | 27 | == PascalCasing 명명 규칙 28 | 29 | 쌍봉 낙타 규칙이라고도 불리는 PascalCasing 명명 규칙은 CamelCasing 규칙과 유사하나 모든 단어의 첫 단어를 대문자로 지정하는 방법입니다. 클래스, 인터페이스, 열거형 등에 사용합니다. 30 | 31 | [source, java] 32 | ---- 33 | class ProductFactory { } 34 | ---- 35 | 36 | --- 37 | 38 | link:./02-2_naming_rule.adoc[이전: 변수 명명 규칙] + 39 | link:./02-4_java_keyword.adoc[다음: Java 키워드] -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/03-1_using_primitive_types.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 3: 기본 데이터 타입 사용 2 | 3 | 프로그램에서 변수를 사용하려면 변수를 선언하고, 자동으로 값이 할당되지 않은 경우 변수에 값을 할당해야 합니다. 이 단원에서는 원시 데이터 타입 변수를 선언하고 값을 할당하는 여러가지 방법 및 변수를 연산에 사용하는 방법을 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03-2_locationvariable_assign.adoc[지역 변수 선언과 값 할당] 8 | 2. link:./03-3_compoundassignment.adoc[합성 할당] 9 | 3. link:./03-4_operator.adoc[일반 연산자] 10 | 4. link:./03-5_incrementoperation.adoc[증가/감소 연산] 11 | 5. link:./03-6_priority.adoc[연산자 우선 순위] 12 | 13 | --- 14 | 15 | link:./02-4_java_keyword.adoc[이전: Java 키워드] + 16 | link:./03-2_locationvariable_assign.adoc[다음: 지역 변수 선언과 값 할당] 17 | -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/03-6_priority.adoc: -------------------------------------------------------------------------------- 1 | = 연산자 우선 순위 2 | 3 | * 연산자 우선 순위 4 | * 할당 연산자를 제외한 모든 이항 연산자는 왼쪽으로 결합 5 | * 할당 연산자와 조건 연산자는 오른쪽으로 결합 6 | * 할당 연산의 우선 순위는 가장 낮음 7 | 8 | --- 9 | 10 | == 연산자 우선 순위 11 | 12 | 식(expression)에 여러 연산자가 포함된 경우 연산자의 우선 순위에 따라 개별 연산자가 동작하는 순서가 결정됩니다. 예를 들어, 곱셈 연산자가 더하기 연산자보다 우선 순위가 높기 때문에 식 x + y * z는 x + (y * z)로 평가됩니다. 13 | 14 | Java의 연산자에서 할당 연산자(=, +=. -= 등)는 우선 순위가 가장 낮아 항상 식의 마지막에 실행됩니다. y = x + z * w 식의 경우 x + z * w 가 먼저 연산 된 후 y에 할당됩니다. 15 | 16 | == 연관성 17 | 18 | 우선 순위가 같은 두 연산자 사이에 피연산자가 발생하면 연산자의 연관성이 연산이 수행되는 순서를 제어합니다. 예를 들어 x + y + z는 (x + y) + z로 평가됩니다. 이것은 할당 연산자에서 특히 중요합니다. x = y = z는 x = (y = z)로 평가됩니다. 19 | 20 | * 할당 연산자를 제외한 모든 이항 연산자를 왼쪽으로 연관됩니다. 즉, 왼쪽에서 오른쪽으로 연산이 수행됩니다. 21 | * 할당 연산자와 조건 연산자( ?: )는 오른쪽으로 결합됩니다. 즉, 오른쪽에서 왼쪽으로 연산이 수행됩니다. 22 | 23 | 괄호를 사용하여 연관성을 제어할 수 있습니다. 예를 들어 예를 들어 x + y * z는 먼저 y에 z를 곱한 다음 결과를 x에 더하지만 (x + y) * z는 먼저 x와 y를 더한 다음 결과에 z를 곱합니다 24 | 25 | --- 26 | 27 | link:./03-5_incrementoperation.adoc[이전: 증가/감소 연산] + 28 | link:./04-1_type_casting.adoc[다음: Chapter 4: 데이터 타입 변환] -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/04-1_type_casting.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 4: 데이터 타입 변환 2 | 3 | Java 에서는 두 가지 형태의 데이터 타입 변환이 있습니다. 이 단원에서는 원시 데이터 타입의 타입 변환에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 1. link:./04-2_type_casting_rule.adoc[기본 데이터 타입 변환 규칙] 7 | 2. link:./04-3_implicit_casting.adoc[암시적 형 변환(Implicit data type conversion)] 8 | 3. link:./04-4_explicit_casting.adoc[명시적 형 변환(Explicit data type conversion)] 9 | 4. link:./04-5_typecasting.adoc[연산 시 타입 변환] 10 | 11 | --- 12 | 13 | link:./03-6_priority.adoc[이전: 기본 데이터 타입 사용] + 14 | link:./04-2_type_casting_rule.adoc[다음: 기본 데이터 타입 변환 규칙] 15 | -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/04-2_type_casting_rule.adoc: -------------------------------------------------------------------------------- 1 | = 기본 데이터 타입 변환 규칙 2 | 3 | * 타입의 메모리 공간 크기를 기준으로 변환하지 않음 4 | * 값의 표현 범위를 기준으로 변환 5 | 6 | image:./images/image04.png[] 7 | 8 | --- 9 | 10 | Java에서 기본 데이터 타입의 변환은 각 타입의 메모리 공간 크기를 기준으로 하지 않고, 값의 표현 범위를 기준으로 합니다. 11 | 12 | 정수만을 표현할 수 있는 타입보다 실수를 표현할 수 있는 타입이 값의 표현 범위가 넓습니다. 단정도 float는 같은 메모리 공간 크기를 가지는 int보다 더 큰 정수를 표현할 수 있습니다. 13 | 14 | --- 15 | 16 | link:./04-1_type_casting.adoc[이전: 데이터 타입 변환] + 17 | link:./04-3_implicit_casting.adoc[다음: 암시적 타입 변환] -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/04-5_typecasting.adoc: -------------------------------------------------------------------------------- 1 | = 연산 시 타입 변환 2 | 3 | * 정수형 간의 산술 연산은 32bit 정수형으로 암시적 타입 변환 4 | * 정수와 실수의 산술 연산은 32bit 실수형으로 암시적 타입 변환 5 | 6 | --- 7 | 8 | 기본 데이터 타입간의 연산 과정에서도 타입 변환이 발생합니다. 9 | 10 | == 정수형 간의 산술 연산 시 타입 변환 11 | 12 | 정수형 간의 산술 연산 시, 기본적으로 32bit 정수형(int)으로 암시적 타입 변환한 후 계산합니다. byte와 byte간의 연산이나, shot와 byte 연산등의 계산 결과는 int 타입입니다. 13 | 14 | [source, java] 15 | ---- 16 | byte byteValue = 6; 17 | short shortValue = 7; 18 | short result = byteValue + shortValue; // 오류 19 | int result = byteValue + shortValue; // 동작함 20 | short result = (short)(byteValue + shortValue); // short으로 할당할 경우 명시적 타입 변환 21 | ---- 22 | 23 | == 정수와 실수의 산술 연산 시 타입 변환 24 | 25 | 정수와 실수의 산술 연산 시, float 타입과의 산술 연산은 32bit 실수형으로, double 타입과의 산술 연산은 64bit 실수형으로 암시적 타입 변환됩니다. 26 | 27 | [source, java] 28 | ---- 29 | float floatValue = 12.5F; 30 | int intValue = 5; 31 | float result = floatValue + intValue; // float으로 암시적 타입 변환 32 | 33 | double doubleValue = 12.5; 34 | int intValue = 5; 35 | double result = doubleValue + intValue; // double로 암시적 타입 변환 36 | ---- 37 | 38 | --- 39 | 40 | link:./04-4_explicit_casting[이전: 명시적 타입 변환] + 41 | link:./99_review.adoc[다음: 검토] -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/99_review.adoc: -------------------------------------------------------------------------------- 1 | = 검토 2 | 3 | * 값 타입과 참조 타입 4 | * 변수 이름 붙이기 5 | * 기본 데이터 타입 사용 6 | * 데이터 타입 변환 7 | 8 | --- 9 | 10 | Quiz 11 | 12 | 1. 값 타입과 참조 타입이 저장되는 각각의 자료 구조는 무엇입니까? 13 | 2. 값 타입이 null일 수 있습니까? 14 | 3. Java에서 초기화되지 않은 값 타입 변수를 사용할 수 있습니까? 15 | 4. 암시적 형 변환의 결과로 크기가 손실될 수 있습니까? 16 | 5. Long 타입의 정수 223372036854775807을 int로 명시적 형 변환하면 494665727이 됩니다. 이유를 설명하시오. 17 | 18 | --- 19 | 20 | link:./20_typecasting.adoc[이전: 연산 시 타입 변환] -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module03_primitive_data_type/contents/images/image01.png -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module03_primitive_data_type/contents/images/image02.png -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module03_primitive_data_type/contents/images/image03.png -------------------------------------------------------------------------------- /course/Module03_primitive_data_type/contents/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module03_primitive_data_type/contents/images/image04.png -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module04_statement_and_exception/.DS_Store -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/LabFile/Lab4-1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module04_statement_and_exception/LabFile/Lab4-1.zip -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/LabFile/Lab4-2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module04_statement_and_exception/LabFile/Lab4-2.zip -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/01_statement_and_exception.adoc: -------------------------------------------------------------------------------- 1 | = Module 04: Statement과 Exception 2 | 3 | 프로그래밍 언어를 사용하는데 필요한 기본 기술 중 하나는 해당 언어로 프로그램의 논리를 구성하는 문을 작성하는 능력입니다. 이 모듈에서는 Java에서 일반적인 명령문을 작성하는 방법을 설명합니다. 4 | 5 | 또한 이 모듈에서는 예외를 던지고 처리하는 방법과 try-finally 블록을 사용해 예외로 인해 프로그램이 중단되지 않도록 하는 방법을 설명합니다. 6 | 7 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 8 | 9 | * Selection Statement(선택문)의 사용 10 | * Iteration Statement(반복문)의 사용 11 | * Jump Statement(분기문)의 사용 12 | * 예외 처리 13 | 14 | == Table of Contents 15 | 16 | 1. link:./02_statement_overview.adoc[Statement(문) 개요] 17 | 2. link:./05_selection_statement.adoc[Selection Statement(선택문)] 18 | 3. link:./09_iteration.adoc[Iteration Statement(반복문)] 19 | 4. link:./14_jump_statement.adoc[Jump Statement(분기문)] 20 | 5. link:./20_exceptions.adoc[기본 예외 처리] 21 | 6. link:./25_throw_exception.adoc[예외 발생시키기] 22 | 23 | --- 24 | 25 | link:./02_statement_overview.adoc[다음: Statement 개요] -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/02_statement_overview.adoc: -------------------------------------------------------------------------------- 1 | = Statement(문) 개요 2 | 3 | 프로그램은 일련의 문으로 구성됩니다. 문은 프로그램에 표시되는 대로 왼쪽에서 오른쪽으로, 위에서 아래로 실행됩니다. 이 장에서는 Java의 문에 대해 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03_block.adoc[Statement Block (문 블록)] 8 | 2. link:./04_statement.adoc[Statement Type (문 유형)] 9 | 10 | --- 11 | 12 | link:./01_statement_and_exception.adoc[이전: Statement와 Exception] + 13 | link:./03_block.adoc[다음: statement block(문 블록)] -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/04_statement.adoc: -------------------------------------------------------------------------------- 1 | = Statement(문)의 종류 2 | 3 | * Java는 흐름제어를 위한 세 가지 종류의 문을 제공 4 | ** 선택문: if 문과 switch 문 5 | ** 반복문: while, do, for, foreach 문 6 | ** 분기문: break, continue문 7 | 8 | --- 9 | 10 | 프로그램이 커질수록 프로그램 논리가 복잡해집니다. 따라서 프로그램에는 구조화된 흐름제어가 필요하며, 이는 추상화 수준에서의 구성 또는 문을 사용하여 제어할 수 있습니다. Java는 다음과 같은 범주의 흐름제어를 위한 문을 제공합니다. 11 | 12 | * 선택문(Selection statement) + 13 | if 및 switch 문은 선택문으로 분류됩니다. 식의 값을 선택하고 그 선택에 따라 문을 실행합니다. 14 | * 반복문(Iteration statement) + 15 | while, do, for, foreach 문은 특정 조건이 true일 동안 반복적으로 실행되는 문이며 반복문으로 분류됩니다. 16 | * 분기문(Jump Statement) + 17 | break, continue 문은 제어를 다른 문으로 옮기는데 사용됩니다. 18 | 19 | --- 20 | 21 | link:./03_block.adoc[이전: Statement Block(문 블록)] + 22 | link:./05_selection_statement.adoc[다음: Selection Statement(선택 문)] -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/05_selection_statement.adoc: -------------------------------------------------------------------------------- 1 | = Selection Statement(선택 문) 2 | 3 | if 및 switch문은 선택문으로 분류됩니다. 식의 값에 따라 선택하고 그 선택에 따라 선택적으로 문을 실행합니다. 이 장에서는 Java에서 지원하는 선택문을 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./06_if_statement.adoc[if Statement (if 문)] 8 | 2. link:./07_cascading_if.adoc[cascading if Statement (Cascading if 문)] 9 | 3. link:./08_switch.adoc[switch Statement (Statement 문)] 10 | 11 | --- 12 | 13 | link:./04_statement.adoc[이전: Statement(문)의 종류] + 14 | link:./06_if_statement.adoc[다음: if Statement (if 문)] 15 | -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/09_iteration.adoc: -------------------------------------------------------------------------------- 1 | = Iteration Statement (반복 문) 2 | 3 | `while`, `do`, `for` 및 `foreach` 문은 반복문으로 분류되며, 반복문은 특정 조건이 `true` 인 동안 작업을 수행합니다. 이 단원에서는 Java에서 지원하는 반복문을 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./10_while.adoc[while statement (while 문)] 8 | 2. link:./11_do.adoc[do statement (do 문)] 9 | 3. link:./12_for.adoc[for statement (for 문)] 10 | 4. link:./13_foreach.adoc[foreach statement (foreach 문)] 11 | 12 | --- 13 | 14 | link:./08_switch.adoc[이전: switch statement (switch 문)] + 15 | link:./10_while.adoc[다음: while statement (while 문)] -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/14_jump_statement.adoc: -------------------------------------------------------------------------------- 1 | = Jump Statement (분기 문) 2 | 3 | `break`, `continue` 문은 분기문으로 분류되며, 프로그램의 한 지점에서 다른 지점으로 제어를 전송하는데 사용됩니다. 이 장에서는 Java에서 지원하는 `break`, `continue` 문을 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./15_goto.adoc[goto문] 8 | 2. link:./16_break_continue.adoc[break, continue문] 9 | 10 | --- 11 | 12 | link:./13_foreach.adoc[이전: foreach statement (foreach 문)] + 13 | link:./15_goto.adoc[다음: goto statement] -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/15_goto.adoc: -------------------------------------------------------------------------------- 1 | = goto statement (goto 문) 2 | 3 | * Java에서는 goto문을 사용하지 않음 4 | * Java Virtual Machine에서는 있었지만 제거됨 5 | * goto 키워드는 존재하지만 구현되지 않음 6 | 7 | --- 8 | 9 | 컬렉션은 객체를 저장하고 동일한 방법으로 순환, 반복, 삽입, 삭제하는 것을 목적으로 만들어진 개체입니다. 10 | 11 | C, C++. C# 같은 언어에서 제공하는 분기문인 `goto` 문은 레이블이 지정된 문으로 제어를 전송합니다. C#에서의 `goto` 문은 아래와 같이 레이블을 선언하고 조건에 따라 레이블로 분기합니다. 12 | 13 | [source, java] 14 | ---- 15 | int number = 4; 16 | if (number % 2 == 0) 17 | goto Even; 18 | Console.WriteLine("Odd"); 19 | goto End; 20 | 21 | Even: 22 | Console.WriteLine("Even"); 23 | End: 24 | ; 25 | ---- 26 | 27 | Java는 `goto` 문을 제공하지 않습니다. goto는 JVM에 구현되었지만 이후에 제거되었습니다. 자바 개발자그룹은 애초에 Java 언어에서 goto가 구현될 것으로 생각하여 키워드에 포함하였지만 break/continue 문 등으로 구현할 수 있어 이후 불필요하다고 생각하여 제거되었습니다. 28 | 29 | `goto` 기능은 JVM에서 제거되었으나, 키워드로 지정되어 있어 변수 등의 이름으로 사용할 수 없습니다. 30 | 31 | --- 32 | 33 | link:./14_jump_statement.adoc[이전: Jump Statement (분기 문)] + 34 | link:./16_break_continue.adoc[다음: break와 continue statement(break 문과 continue 문)] -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/20_exceptions.adoc: -------------------------------------------------------------------------------- 1 | = 기본 예외 처리 2 | 3 | 프로그램을 개발할 때 실제 프로그램의 논리보다 오류를 확인하고 처리하는데 더 많은 시간을 소요하는 경우가 많습니다. 예외를 사용하면 이 문제를 단순화할 수 있습니다. 이 단원에서는 Java에서 예외를 잡고 처리하는 방법을 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./21_why_exceptions.adoc[예외를 왜 사용해야 하는가?] 8 | 2. link:./22_exception_object.adoc[예외 객체] 9 | 3. link:./23_try_catch_block.adoc[try/catch 블록] 10 | 4. link:./24_multiple_catch_block.adoc[다중 catch 블록] 11 | 12 | --- 13 | 14 | link:./19_lab4-1.adoc[이전: Lab 4-1: 연도 일자를 월/일로 계산] + 15 | link:./21_why_exceptions.adoc[다음: 예외를 왜 사용해야 하는가?] -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/25_throw_exception.adoc: -------------------------------------------------------------------------------- 1 | = 예외 발생시키기 2 | 3 | Java에서는 프로그래머가 필요한 경우 예외를 발생시키고 적절하게 처리할 수 있도록 throw문과 finally 절을 제공합니다. 이 장에서는 예외를 임의로 발생시키고 처리할 수 있는 방법을 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./26_throw.adoc[throw 문] 8 | 2. link:./27_exception_method.adoc[메소드에 예외 선언] 9 | 3. link:./28_finally.adoc[finally절] 10 | 4. link:./29_try_with_resource.adoc[try-with-resource문] 11 | 12 | --- 13 | 14 | link:./24_multiple_catch_block.adoc[이전: 다중 catch 블록] + 15 | link:./26_throw.adoc[다음: throw statement (throw 문)] -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/31_review.adoc: -------------------------------------------------------------------------------- 1 | = 검토 2 | 3 | * 문 개요 4 | * 선택문 5 | * 반복문 6 | * 분기문 7 | * 기본 예외 처리 8 | * 예외 발생시키기 9 | 10 | --- 11 | 12 | Quiz 13 | 14 | 1. 정수형 변수 hour가 0보다 크거나 같고 24 보다 작은 지 테스트하는 코드를 작성하세요. 해당하지 않을 경우 hour를 0으로 재설정합니다. 15 | 2. 표준 입력에서 읽은 문자열을 정수로 변환하고 이를 정수형 변수 hor에 저장한 후 hour 값이 1에서 23사이에 있을 경우 반복을 멈추는 do-while 코드를 작성하세요. 16 | 3. 1, 2번 문제의 모든 조건을 만족하며, hour 값을 5번만 입력 받을 수 있는 for 문을 작성하세요. break와 continue문을 사용하면 안됩니다. 17 | 4. `break` 문을 사용하여 3번 문제를 다시 작성하세요. 18 | 5. 정수형 변수 `percent` 가 0보다 작거나 100보다 큰 경우 `IllegalArgumentException` 예외를 발생시키는 코드를 작성하세요. 19 | 6. 다음 코드는 예외를 처리하기 위해 작성하였지만, 동작하지 않습니다. 이유를 설명하고 동작하도록 수정하세요. 20 | + 21 | [source, java] 22 | ---- 23 | try 24 | { 25 | ... 26 | } 27 | catch (Exception) {...} 28 | catch (IOException) {...} 29 | ---- 30 | 31 | --- 32 | 33 | link:./30_lab4-2.adoc[이전: Lab 4-2 예외 처리] -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module04_statement_and_exception/contents/images/image01.png -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module04_statement_and_exception/contents/images/image02.png -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module04_statement_and_exception/contents/images/image03.png -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module04_statement_and_exception/contents/images/image04.png -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module04_statement_and_exception/contents/images/image05.png -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/contents/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module04_statement_and_exception/contents/images/image06.png -------------------------------------------------------------------------------- /course/Module04_statement_and_exception/homework/maze.adoc: -------------------------------------------------------------------------------- 1 | //// 2 | = 미로 탐색 3 | 4 | N x N 크기의 배열로 표현되는 미로가 있다. 5 | 6 | [source, java] 7 | ---- 8 | int[][] maze = { 9 | {0,0,1,0,0}, 10 | {1,0,0,0,1}, 11 | {0,1,1,0,0}, 12 | {1,0,0,0,0}, 13 | {0,0,1,0,0} 14 | } 15 | ---- 16 | 17 | 미로에서 0은 이동할 수 있는 칸을 나타내고, 1은 이동할 수 없는 칸을 나타낸다. 이런 미로가 주어졌을 때 (0, 0)에서 출발하여 (N, N)의 위치로 이동할 수 있는지 없는지의 여부를 판단하는 프로그램을 작성하라. 18 | 19 | == 프로그램에서 지켜야 하는 규칙 20 | 21 | * 10 x 10 배열을 임의로 생성하여 사용한다. (프롬프트에서 입력 받아 생성하는 등의 방법을 사용하지 않으며, 배열의 선언은 코드에 포함된다) 22 | * 한 칸에서 다른 칸으로 이동할 때는 서로 인접한 칸으로만 이동할 수 있다. 23 | * 9,9 배열로 이동할 수 있으면 "Pass"를 출력하고, 없으면 "Fail"을 출력한다. 24 | * 소스코드는 한글을 포함하지 않는다. 25 | * 패키지를 지정하지 않는다. 26 | * 메시지와 이동한 칸의 수를 함께 출력한다. 출력의 모양은 아래와 같다. 27 | ** 성공했을 경우 28 | + 29 | [source, bash] 30 | ---- 31 | Pass, 14 32 | ---- 33 | + 34 | ** 실패했을 경우 35 | + 36 | [source, bash] 37 | ---- 38 | Fail, 21 39 | ---- 40 | 41 | == 제출 방법 42 | 43 | * main 메소드가 포함된 클래스를 public으로 선언하고 학번_Maze 로 작성한다. 44 | * 여러 클래스를 포함하는 경우, 모든 클래스를 단일 파일에 작성한다. 45 | * 학번_Maze.java 소스 파일을 제출한다. (압축, 파일 분할 금지) 46 | //// -------------------------------------------------------------------------------- /course/Module05_method_parameter/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module05_method_parameter/.DS_Store -------------------------------------------------------------------------------- /course/Module05_method_parameter/LabFile/Lab 5-1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module05_method_parameter/LabFile/Lab 5-1.zip -------------------------------------------------------------------------------- /course/Module05_method_parameter/LabFile/Lab 5-2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module05_method_parameter/LabFile/Lab 5-2.zip -------------------------------------------------------------------------------- /course/Module05_method_parameter/contents/01_method_parameter.adoc: -------------------------------------------------------------------------------- 1 | = Module 05: 메소드와 파라미터 2 | 3 | 대부분의 응용 프로그램을 설계할 때, 응용 프로그램을 기능 단위로 나눕니다. 코드를 작은 부분으로 나누면 설계가 용이하고, 코드를 이해하기 쉬우며, 단위로 디버깅 할 수 있기 때문에 코드를 작은 부분으로 나누는 것은 응용 프로그램을 디자인하는 핵심 원칙입니다. 4 | 5 | Javad에서는 클래스들 내에서 명명된 코드 블록을 단위로 응용 프로그램을 구성합니다. 이것을 메소드라고 하며, 메소드는 작업을 수행하거나 값을 계산하는, 클래스의 구성원입니다. 6 | 7 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 8 | 9 | * 파라미터를 받아들이고 값을 반환하는 정적 메소드를 생성할 수 있습니다. 10 | * 파라미터를 전달하는 여러 방법에 대해 이해하고, Java에서의 전달 방식을 알 수 있습니다. 11 | * 메소드 오버로딩을 정의합니다. 12 | 13 | == Table of Contents 14 | 15 | 1. link:./02_method.adoc[메소드] 16 | 2. link:./08_parameter.adoc[파라미터] 17 | 3. link:./14_method_signature.adoc[메소드 오버로딩] 18 | 19 | --- 20 | 21 | link:./02_method.adoc[다음: 메소드] -------------------------------------------------------------------------------- /course/Module05_method_parameter/contents/02_method.adoc: -------------------------------------------------------------------------------- 1 | = 메소드 2 | 3 | 메소드는 프로그램을 구조화하는 중요한 메커니즘입니다. 이 장에서는 Java에서 메소드를 만드는 방법과, 단일 클래스 내에서 또는 다른 클래스에서 메소드를 호출하는 방법을 배웁니다. 4 | 5 | 또한 로컬 변수를 사용하고 어떻게 선언하며 제거하는지와 값을 변환하고 파라미터를 사용해서 데이터를 메소드로 전달하는 것을 배웁니다. 6 | 7 | == Table of Contents 8 | 9 | 1. link:./03_method_declareation.adoc[메소드 선언] 10 | 2. link:./04_method_invocation.adoc[메소드 호출] 11 | 3. link:./05_return_statement.adoc[return statement] 12 | 4. link:./06_local_variable.adoc[지역 변수] 13 | 5. link:./07_value_return.adoc[값 return] 14 | 15 | --- 16 | 17 | link:./01_method_parameter.adoc[이전: 메소드와 파라미터] + 18 | link:./03_method_declareation.adoc[다음: 메소드 선언] -------------------------------------------------------------------------------- /course/Module05_method_parameter/contents/08_parameter.adoc: -------------------------------------------------------------------------------- 1 | = 파라미터 2 | 3 | 이 단원에서는 파라미터를 사용하는 방법과 파라미터가 있는 메소드를 호출하는 방법을 학습하며, 파라미터를 전달하는 방법도 배웁니다. 마지막으로 재귀 메소드를 작성하는 방법을 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./09_parameter_declaration.adoc[파라미터 선언과 호출] 8 | 2. link:./10_parameter_passing.adoc[파라미터 전달 매커니즘] 9 | 3. link:./11_pass_by_value.adoc[Pass by Value] 10 | 4. link:./12_variant_parameter.adoc[가변 길이 목록 파라미터 사용] 11 | 5. link:./13_recursive.adoc[재귀 메소드 사용] 12 | 13 | --- 14 | 15 | link:./07_value_return.adoc[이전: 값 return] + 16 | link:./09_parameter_declaration.adoc[다음: 파라미터 선언과 호출] -------------------------------------------------------------------------------- /course/Module05_method_parameter/contents/13_recursive.adoc: -------------------------------------------------------------------------------- 1 | = 재귀 메소드 사용 2 | 3 | * 메소드는 자신을 호출할 수 있음 4 | * 직접적 호출 5 | * 간접적 호출 6 | * 특정 문제를 해결하는데 유용하게 사용할 수 있음 7 | 8 | --- 9 | 10 | 메소드는 자신을 호출할 수 있으며 이런 기술을 재귀(Recursive)라고 합니다. 재귀 방법으로 몇 가지 유형의 문제를 해결할 수 있으며 재귀 방법은 목록 및 트리와 같은 복잡한 데이터 구조를 조작할 때 유용합니다. 11 | 12 | Java의 메소드는 상호 재귀적입니다. 메소드 A가 메소드 B를 호출할 수 있고 메소드 B가 메소드 A를 호출할 수 있습니다. 13 | 14 | == 재귀 메소드 예제 15 | 16 | 계승(Factorial)은 1부터 n까지의 자연수를 모두 곱하는 것을 의미하며 기호로 _n!_ 으로 나타냅니다. 순열 또는 조합론의 여러 분야에서 빈번하게 사용됩니다. n개의 물건을 배열하는 방법을 구하거나, 경우의 수를 구할 때 많이 사용됩니다. n까지의 자연수를 하나씩 감소하면서 곱하는 방식으로 계산합니다. 17 | 18 | Java에서 Factorial은 다음과 같은 방식으로 구현할 수 있습니다. 19 | 20 | [source, java] 21 | ---- 22 | static int factorial(int n) { 23 | if (n < 1) { 24 | return 1; 25 | } 26 | else { 27 | return factorial(n - 1) * n; 28 | } 29 | } 30 | ---- 31 | 32 | 재귀 메소드에는 추가 호출없이 return 하는 종료 조건이 있어야 합니다. factorial의 경우 n < 1이 종료 조건입니다. 33 | 34 | --- 35 | 36 | link:./12_variant_parameter.adoc[이전: 가변 길이 목록 파라미터 사용] + 37 | link:./14_method_overloading.adoc[다음: 메소드 오버로딩] -------------------------------------------------------------------------------- /course/Module05_method_parameter/contents/14_method_overloading.adoc: -------------------------------------------------------------------------------- 1 | = 메소드 오버로딩 2 | 3 | 클래스는 같은 이름을 가진 메소드를 두 개 이상 가질 수 없습니다. 파라미터의 개수와 타입에 따라 선택적으로 호출할 수 있는 같은 이름을 가진 메소드를 사용하는 것을 메소드 오버로딩이라고 합니다. 이 단원에서는 클래스에 같은 이름의 메소드를 작성하고 사용하는 방법을 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./15_definition.adoc[메소드 오버로딩 정의] 8 | 2. link:./16_method_signature.adoc[메소드 시그너처(Signature)] 9 | 3. link:./17_using_overloaded_method.adoc[오버로드 된 메소드 사용] 10 | 11 | --- 12 | 13 | link:./13_recursive.adoc[이전: 재귀 메소드 사용] + 14 | link:./15_definition.adoc[다음: 메소드 오버로딩 정의] -------------------------------------------------------------------------------- /course/Module05_method_parameter/contents/20_review.adoc: -------------------------------------------------------------------------------- 1 | = 검토 2 | 3 | * 메소드 4 | * 파라미터 5 | * 메소드 오버로딩 6 | 7 | --- 8 | 9 | Quiz 10 | 11 | 1. 메소드가 무엇이고 왜 중요한지 설명하세요. 12 | 2. Java의 유일한 파라미터 전달 방법이 무엇인지 설명하세요. 13 | 3. 로컬 변수는 언제 생성되고 언제 생성됩니까? 14 | 4. 메소드의 시그너처를 구성하는 것은 무엇입니까? 15 | 16 | link:./19_lab_5-2.adoc[이전: Lab 5-2 메소드 오버로딩] -------------------------------------------------------------------------------- /course/Module05_method_parameter/contents/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module05_method_parameter/contents/images/image01.png -------------------------------------------------------------------------------- /course/Module05_method_parameter/contents/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module05_method_parameter/contents/images/image02.png -------------------------------------------------------------------------------- /course/Module05_method_parameter/contents/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module05_method_parameter/contents/images/image03.png -------------------------------------------------------------------------------- /course/Module05_method_parameter/contents/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module05_method_parameter/contents/images/image04.png -------------------------------------------------------------------------------- /course/Module05_method_parameter/contents/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module05_method_parameter/contents/images/image05.png -------------------------------------------------------------------------------- /course/Module05_method_parameter/contents/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module05_method_parameter/contents/images/image06.png -------------------------------------------------------------------------------- /course/Module06_array/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/.DS_Store -------------------------------------------------------------------------------- /course/Module06_array/LabFile/Lab6-1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/LabFile/Lab6-1.zip -------------------------------------------------------------------------------- /course/Module06_array/contents/01_array.adoc: -------------------------------------------------------------------------------- 1 | = Module 06: 배열 2 | 3 | 배열은 데이터를 그룹화하는 수단을 제공합니다. Java를 최대한 활용하려면 배열을 효과적으로 만들고 사용하는 방법을 이해하는 것이 중요합니다. 이 단원에서는 Java에서 배열을 사용하는 방법에 대해 학습합니다. 4 | 5 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 6 | 7 | * 배열을 생성하고, 초기화하고 사용할 수 있게 됩니다. 8 | * Java 프로그램에서 명령 줄 인자를 사용할 수 있습니다. 9 | * 배열 변수와 배열 인스턴스의 관계를 이해합니다. 10 | * 메소드 파라미터로 배열을 사용합니다. 11 | * 메소드에서 배열을 return 합니다. 12 | 13 | == Table of Contents 14 | 15 | 1. link:./02_overview_array.adoc[배열 개요] 16 | 2. link:./09_array_creation.adoc[배열 생성] 17 | 3. link:./16_using_array.adoc[배열 사용] 18 | 19 | --- 20 | 21 | link:./02_overview_array.adoc[다음: 배열 개요] -------------------------------------------------------------------------------- /course/Module06_array/contents/02_overview_array.adoc: -------------------------------------------------------------------------------- 1 | = 배열 개요 2 | 3 | 이 장에서는 일반적인 배열 개념에 대한 개요를 제공하고, Java에서 배열을 선언하는데 사용되는 주요 구문을 소개하며 차원 및 요소와 같은 배열의 기본 기능을 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03_whatisarray.adoc[배열이란?] 8 | 2. link:./04_array_in_java.adoc[Java에서 배열 표기법] 9 | 3. link:./05_dimension.adoc[배열의 차원] 10 | 4. link:./06_array_element_access.adoc[배열 요소에 액세스] 11 | 5. link:./07_array_boundary.adoc[배열 경계 검사] 12 | 6. link:./08_array_collection.adoc[배열과 컬렉션 비교] 13 | 14 | --- 15 | 16 | link:./01_array.adoc[이전: 배열] + 17 | link:./03_whatisarray.adoc[다음: 배열이란?] -------------------------------------------------------------------------------- /course/Module06_array/contents/03_whatisarray.adoc: -------------------------------------------------------------------------------- 1 | = 배열이란? 2 | 3 | * 배열은 요소를 순서대로 모아서 관리하기 위해 만들어진 자료구조 4 | * 배열의 모든 요소는 같은 타입을 가짐 5 | * 각각의 요소에는 정수 인덱스를 사용해서 액세스 6 | 7 | image:./images/image01.png[] 8 | --- 9 | 10 | 배열은 요소를 순서대로 모아서 관리하기 위해 만들어진 자료구조입니다. 인덱스라고 부르는 정수로 만들어진 위치를 사용하여 배열내 각각의 요소에 액세스 할 수 있습니다. 11 | 12 | 배열은 임의 접근(Random Access)를 허용합니다. 이는 프로그램의 배열의 요소에 순서와 관계없이 빠르게 액세스 할 수 있음을 의미합니다. 13 | 14 | --- 15 | 16 | link:./02_overview_array.adoc[이전: 배열 개요] + 17 | link:./04_array_in_java.adoc[다음: Java에서 배열 표기법] -------------------------------------------------------------------------------- /course/Module06_array/contents/04_array_in_java.adoc: -------------------------------------------------------------------------------- 1 | = Java에서 배열 표기법 2 | 3 | * 다음 항목들을 지정하여 배열 선언: 4 | * 배열에 나열될 요소들의 타입 5 | * 배열의 차원 6 | * 배열을 선언한 변수 이름 7 | 8 | image:./images/image02.png[] 9 | 10 | --- 11 | 12 | Java의 배열 표기법은 C/C++, C#등 다른 언어들과 비슷합니다. 먼저 타입을 지정한 다음 변수 이름뒤에 세미 콜론을 지지정합니다. 그리고 대괄호를 사용하여 배열을 선언합니다. 13 | 14 | Java에서 배열을 선언하는 방법은 크게 두 가지가 있습니다. 15 | 16 | * 생성할 배열의 타입을 선언한 후 대 괄호를 붙이고 뒤에 변수 이름을 선언하는 방법 17 | + 18 | [source, java] 19 | ---- 20 | type[] arrayName; 21 | ---- 22 | + 23 | * 타입을 선언하고 뒤에 변수를 선언한 후 변수에 대 괄호를 붙이는 방법 24 | + 25 | [source, java] 26 | ---- 27 | type arrayName[] 28 | ---- 29 | 30 | 배열을 선언하며 배열의 크기를 지정할 수는 없습니다. 31 | [source, java] 32 | ---- 33 | type[3] arrayName; // 허용되지 않음 34 | ---- 35 | 36 | --- 37 | 38 | link:./03_whatisarray.adoc[이전: 배열이란?] + 39 | link:./05_dimension.adoc[다음: 배열의 차원] -------------------------------------------------------------------------------- /course/Module06_array/contents/05_dimension.adoc: -------------------------------------------------------------------------------- 1 | = 배열의 차원 2 | 3 | * 선형 1차원 배열과 표형 2차원 배열, 육면체형 2차원 배열을 선언할 수 있음 4 | * 인덱스가 배열의 각 요소와 연관됨 5 | * 2차원 이상의 배열은 한 배열에 여러 배열이 포함되어 있는 형태 6 | * 배열에 포함된 배열은 각각의 인덱스를 가짐 7 | 8 | image:./images/image03.png[] 9 | 10 | --- 11 | 12 | 1차원 배열을 선언하려면 한 쌍의 대괄호를 사용합니다. 이렇게 선언된 배열은 하나의 정수 인덱스가 배열의 각 요소와 연관되기 때문에 Rank 1 배열이라고도 합니다. 13 | 14 | 2차원 배열을 선언할 때는 두 쌍의 대괄호를 사용합니다. 두 쌍의 대괄호를 사용해 선언된 배열은 두 개의 정수 인덱스가 배열의 각 요소와 연관되기 때문에 Rank 2 배열이라고도 합니다. 15 | 16 | Java에서 다차원 배열을 선언하는 것은 대괄호의 개수에 따라 명확한 방식으로 확장됩니다. 대괄호 쌍의 수에 따라 Rank가 하나씩 증가합니다. 17 | 18 | 배열 변수 선언시에는 각 차원의 길이를 포함하지 않아야 합니다. 19 | 20 | --- 21 | 22 | link:./04_array_in_java.adoc[이전: Java에서 배열 표기법] + 23 | link:./06_array_element_access.adoc[다음: 배열 요소에 접근] -------------------------------------------------------------------------------- /course/Module06_array/contents/09_array_creation.adoc: -------------------------------------------------------------------------------- 1 | = 배열 생성 2 | 3 | 이 장에서는 배열 인스턴스를 생성하는 방법, 배열 인스턴스 요소를 명시적으로 초기화하는 방법 및 배열 변수를 복사하는 방법을 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./10_create_array_instance.adoc[배열 인스턴스 생성] 8 | 2. link:./11_initiate_element.adoc[배열 요소 초기화] 9 | 3. link:./12_initiate_mutiple_dimension.adoc[다차원 배열 요소 초기화] 10 | 4. link:./13_jagged_array.adoc[가변 길이 배열] 11 | 5. link:./14_calcuated_length_array.adoc[계산된 크기를 가진 배열 생성] 12 | 6. link:./15_copy_array_elements.adoc[배열 요소 복사] 13 | 14 | --- 15 | 16 | link:./08_array_colleciton.adoc[이전: 배열과 컬렉션 비교] + 17 | link:./10_create_array_instance.adoc[다음: 배열 인스턴스 생성] -------------------------------------------------------------------------------- /course/Module06_array/contents/10_create_array_instance.adoc: -------------------------------------------------------------------------------- 1 | = 배열 인스턴스 생성 2 | 3 | * 배열 변수를 선언한다고 해서 배열이 생성되지 않음 4 | * new 키워드를 사용해서 명시적으로 배열 인스턴스를 생성해야 함 5 | * 배열이 생성되면 기본 값이 암시적으로 할당됨 6 | 7 | image:./images/image08.png[] 8 | 9 | --- 10 | 11 | 배열 변수를 선언한다고 해서 배열이 생성되지 않습니다. 이는 배열이 값 타입이 아니라 참조타입이기 때문입니다. new 키워드를 사용하여 배열 인스턴스를 생성해야 합니다. 배열 인스턴스를 생성할 때 모든 차원의 배열 크기를 지정해야 합니다. 다음과 같이 배열의 크기를 지정하지 않으면 컴파일시에 오류가 발생합니다. 12 | 13 | ---- 14 | int[] row = new int[]; 15 | int[][] grid = new grid[][]; 16 | ---- 17 | 18 | Java 컴파일러는 암시적으로 각 배열 요소를 배열 요소 유형에 따라 기본값으로 초기화 합니다. 정수 타입 배열 요소는 암시적으로 0으로 초기화되고, 부동 소수점 배열 요소는 0.0으로 초기화 됩니다. boolean 배열 요소는 false로 초기화됩니다. 19 | 20 | ---- 21 | int[] row = new int[5]; 22 | ---- 23 | 24 | 런타임에는 실제적으로 아래와 같이 실행됩니다. 25 | 26 | ---- 27 | int[] row = new int[5]; 28 | row[0] = 0; 29 | row[1] = 0; 30 | row[2] = 0; 31 | row[3] = 0; 32 | row[4] = 0; 33 | ---- 34 | 35 | --- 36 | 37 | link:./09_array_creation.adoc[이전: 배열 생성] + 38 | link:./11_initiate_element.adoc[다음: 배열 요소 초기화] -------------------------------------------------------------------------------- /course/Module06_array/contents/11_initiate_element.adoc: -------------------------------------------------------------------------------- 1 | = 배열 요소 초기화 2 | 3 | * 배열의 요소는 선언시 명시적으로 초기화될 수 있음 4 | * 편리하게 줄여 쓸 수 있는 방법 제공 5 | * 선언 시 초기화 할 때 배열의 크기를 사용할 수 없음 6 | 7 | image:./images/image09.png[] 8 | 9 | --- 10 | 11 | 배열 이니셜라이저를 사용해서 배열 인스턴스 요소의 값을 초기화 할 수 있습니다. 배열 이니셜라이저는 중괄호로 묶이고 쉼표로 구분된 일련의 식입니다. 배열 이니셜라이저는 왼쪽에서 오른쪽으로 실행되며, 다음과 같이 메소드 호출과 복잡한 식을 사용할 수 있습니다: 12 | 13 | [source, java] 14 | ---- 15 | int[ ] data = new int[] {a, b( ), c*d, e( )+f( )}; 16 | ---- 17 | 18 | 배열을 이니셜라이저를 사용하여 생성할 때는 배열의 크기를 정의할 수 없습니다. 19 | 20 | [source, java] 21 | ---- 22 | int[ ] data = new int[4] {a, b( ), c*d, e( )+f( )}; // 컴파일 타임 오류 23 | ---- 24 | 25 | 배열 변수 선언의 일부로 배열 인스턴스 요소를 초기화 할 때 단축 표기법을 사용할 수 있습니다. 26 | 27 | [source, java] 28 | ---- 29 | int[] data1 = new int[] {1,2,3,4}; // 허용 30 | int[] data2 = {1,2,3,4}; // 허용 31 | data2 = new int[] {5,6,7,8}; // 허용 32 | data2 = {9,10,11,12}; // 허용되지 않음 33 | ---- 34 | 35 | --- 36 | 37 | link:./10_create_array_instance.adoc[이전: 배열 인스턴스 생성] + 38 | link:./12_initiate_mutiple_dimension.adoc[다음: 다차원 배열 요소 초기화] -------------------------------------------------------------------------------- /course/Module06_array/contents/12_initiate_mutiple_dimension.adoc: -------------------------------------------------------------------------------- 1 | = 다차원 배열 요소 초기화 2 | 3 | * 다차원 배열의 요소 또한 선언 시 명시적으로 초기화 할 수 있음 4 | * 다차원 배열에 포함된 각 배열의 초기화는 일차원 배열 초기화 방법과 동일함 5 | 6 | image:./images/image10.png[] 7 | 8 | --- 9 | 10 | 다차원 배열 인스턴스 또한 배열 선언 시 명시적으로 초기화 할 수 있습니다. Java에서 다차원 배열은 배열안에 배열이 포함되어 있는 형태입니다. 배열에 포함된 배열은 쉼표 ( , )로 구분합니다. 11 | 12 | == 2차원 배열 13 | 14 | [source, java] 15 | ---- 16 | int[][] grid = new int[][] { 17 | {1,2,3,4}, // grid[0] 배열 18 | {5,6,7,8} // grid[1] 배열 19 | }; 20 | ---- 21 | 22 | == 3차원 배열 23 | 24 | [source, java] 25 | ---- 26 | int[][][] cube = new int[][][] { 27 | { // cube[0] 배열 28 | {1,2,3,4}, // cube[0][0] 배열 29 | {5,6,7,8} // cube[0][1] 배열 30 | }, 31 | { 32 | {9,10,11,12}, // cube[1][0] 배열 33 | {13,14,15,16} // cube[1][1] 배열 34 | } 35 | }; 36 | ---- 37 | 38 | --- 39 | 40 | link:./11_initate_element.adoc[이전: 배열 요소 초기화] + 41 | link:./13_jagged_array.adoc[다음: 가변 길이 배열] -------------------------------------------------------------------------------- /course/Module06_array/contents/13_jagged_array.adoc: -------------------------------------------------------------------------------- 1 | = 가변 길이 배열 2 | 3 | * Java의 다차원 배열은 배열안에 다른 배열이 포함되어 있는 형태 4 | * 배열 내의 각 배열은 다른 크기를 가질 수 있음 5 | * 배열 인스턴스를 이니셜라이저로 초기화 할 때 내부 배열의 크기를 다르게 지정 6 | * 배열 내 배열의 개수(행 수)를 결정한 후 포함된 배열의 크기를 지정 7 | 8 | image:./images/image11.png[] 9 | 10 | --- 11 | 12 | Java의 다차원 배열은 배열안에 다른 배열이 포함되어 있는 형태입니다. 따라서, 배열 내의 각 배열은 다른 크기를 가질 수 있습니다. 가변 길이 배열은 두 가지 방법으로 인스턴스를 초기화 할 수 있습니다. 13 | 14 | == 배열 이니셜라이저로 초기화 15 | 16 | 배열을 선언할 때 이니셜라이저로 초기화 하면서 크기가 다른 가변 길이 배열 인스턴스를 생성할 수 있습니다. 17 | 18 | [source, java] 19 | ---- 20 | int[][] grid = new int[][] { 21 | {1,2,3,4}, 22 | {5,6,7}, 23 | {8,9,10,11,12} 24 | }; 25 | ---- 26 | 27 | == 배열 내 배열의 수를 결정한 후 포함된 배열의 크기를 지정 28 | 29 | 배열을 선언한 후 초기화 할 때 첫 번째 배열(부모 배열)에 포함된 배열의 수(행 수)를 결정한 후 포함될 배열(자식 배열)의 크기를 결정하지 않고, new 키워드를 사용해서 배열 인스턴스를 초기화하면서 다른 크기의 배열로 인스턴스화 할 수 있습니다. 30 | 31 | [source, java] 32 | ---- 33 | int[][] grid2 = new int[3][]; 34 | grid2[0] = new int[] {1,2,3,4}; 35 | grid2[1] = new int[] {5,6,7}; 36 | grid2[2] = new int[] {8,9,10,11,12}; 37 | ---- 38 | 39 | --- 40 | 41 | link:./12_initate_multiple_dimension.adoc[이전: 다차원 배열 요소 초기화] + 42 | link:./14_calcuated_length_array.adoc[다음: 계산된 크기를 가진 배열 생성] -------------------------------------------------------------------------------- /course/Module06_array/contents/14_calcuated_length_array.adoc: -------------------------------------------------------------------------------- 1 | = 계산된 크기를 가진 배열 생성 2 | 3 | * 배열의 크기는 컴파일 시에 결정될 필요는 없음 4 | * 모든 적법한 정수 식을 이용해서 배열의 크기를 지정 5 | * 배열의 요소에 액세스하는 속도는 동일함 6 | * 배열의 크기를 컴파일 시에 상수로 지정: 7 | 8 | [source, java] 9 | ---- 10 | long[] row = new long[4]; 11 | ---- 12 | 13 | * 배열의 크기를 런타임에 계산된 값을 지정 14 | 15 | [source, java] 16 | ---- 17 | String s = scanner.nextLine(); 18 | int arraySize = Integer.parseInt(s); 19 | int[] array = new int[arraySize]; 20 | ---- 21 | 22 | --- 23 | 24 | 다음 코드와 같이 각 차원의 길이에 대한 런타임 식을 사용하여 다차원 배열을 만들 수 있습니다: 25 | 26 | [source, java] 27 | ---- 28 | Scanner scanner = new Scanner(System.in); 29 | int rowCount = Integer.parseInt(scanner.nextLine()); 30 | int columnCount = Integer.parseInt(scanner.nextLine()); 31 | … 32 | int[][] grid = new int[rowCount][columnCount]; 33 | ---- 34 | 35 | 다른 방법으로, 계산된 값과 상수를 혼용해서 배열을 만들 수도 있습니다. 36 | 37 | [source, java] 38 | ---- 39 | Scanner scanner = new Scanner(System.in); 40 | int rowCount = Integer.parseInt(scanner.nextLine()); 41 | … 42 | int[][] grid = new int[rowCount][3]; 43 | ---- 44 | 45 | --- 46 | 47 | link:./13_jagged_array.adoc[이전: 가변 길이 배열] + 48 | link:./15_copy_array_elements.adoc[다음: 배열 요소 복사] -------------------------------------------------------------------------------- /course/Module06_array/contents/15_copy_array_elements.adoc: -------------------------------------------------------------------------------- 1 | = 배열 요소 복사 2 | 3 | * 배열을 복사하면 변수만 복사되고 값은 복사되지 않음 4 | * 배열 인스턴스를 복사하지 않음 5 | * 두 개의 배열 변수가 같은 배열 인스턴스를 가리킴 6 | 7 | image:./images/image12.png[] 8 | 9 | --- 10 | 11 | 배열 변수를 다른 배열에 할당하면 배일 인스턴스의 전체 복사본을 얻을 수 없습니다. 아래 문은 정수 타입 배열 `row` 를 선언하고 인스턴스를 생성한 후, 역시 정수형 배열 `copy` 를 선언하고 `row` 배열을 `copy` 배열에 할당했습니다. 12 | 13 | [source, java] 14 | ---- 15 | int[] row = new int[4]; 16 | int[] copy = row; 17 | ---- 18 | 19 | 위 코드가 실행된 후 두 배열의 메모리 구조는 아래와 같이 됩니다: 20 | 21 | image:./images/image13.png[] 22 | 23 | 아래 코드는 `row` 배열의 첫 번째 요소 값을 1 증가시킵니다. 24 | 25 | [source, java] 26 | ---- 27 | row[0]++; 28 | ---- 29 | 30 | 위 코드가 실행된 후 두 배열의 메모리 구조는 아래와 같이 됩니다: 31 | 32 | image:./images/image14.png[] 33 | 34 | `copy` 배열과 `row` 배열, 두 배열이 동일한 배열 인스턴스를 참조하기 때문에 `row[0]` 의 값을 변경하는 것은 두 배열 변수에서 정확히 동일한 효과를 나타냅니다. 35 | 36 | --- 37 | 38 | link:./14_calcuated_length_array.adoc[이전: 계산된 크기를 가진 배열 생성] + 39 | link:./16_using_array.adoc[다음: 배열 사용] -------------------------------------------------------------------------------- /course/Module06_array/contents/16_using_array.adoc: -------------------------------------------------------------------------------- 1 | = 배열 사용 2 | 3 | 이 단원에서는 배열을 사용하는 방법과 배열을 메소드에 매개변수로 전달하는 방법을 학습합니다. 4 | 5 | 배열 인스턴스 요소의 기본값을 제어하고 인스턴스의 복사본을 만들어 다른 배열에 할당하는 방법, 배열 사용과 조작을 위한 많은 기능을 제공하는 java.util.Arrrays 클래스를 사용하는 방법 및 foreach 문을 사용하여 배열의 요소를 읽는 방법을 배웁니다. 6 | 7 | == Table of Contents 8 | 9 | 1. link:./17_size_of_array.adoc[배열의 크기] 10 | 2. link:./18_method_of_array.adoc[배열 메소드] 11 | 3. link:./19_return_array.adoc[메소드에서 배열 return] 12 | 4. link:./20_array_as_parameter.adoc[배열을 파라미터로 전달] 13 | 5. link:./21_command_argument.adoc[명령줄 인자] 14 | 6. link:./22_demo_using_commandline_argument.adoc[데모: main 메소드의 파라미터 인자] 15 | 7. link:./23_using_array_in_foreach.adoc[foreach문을 사용하여 배열 요소 읽기] 16 | 17 | 18 | 19 | --- 20 | 21 | link:./15_copy_array_elements.adoc[이전: 배열 요소 복사] + 22 | link:./17_size_of_array.adoc[다음: 배열의 크기] -------------------------------------------------------------------------------- /course/Module06_array/contents/17_size_of_array.adoc: -------------------------------------------------------------------------------- 1 | = 배열의 크기 2 | 3 | image:./images/image15.png[] 4 | 5 | --- 6 | 7 | Java에서 배열은 배열의 크기를 표시하는 `length` 만을 가지고 있습니다. `length` 는 읽기 전용 정수값으로, 배열에 포함된 요소의 크기를 나타냅니다. 8 | 9 | 앞에서 살펴보았듯이, Java에서 다차원 배열은 부모 배열이 자식 배열을 포함하고 있는 형태입니다. 배열의 `length` 값은 배열에 “포함된” 요소의 수를 나타냅니다. 10 | 11 | 예를 들어, 아래와 같은 2차원 배열이 있을 때: 12 | 13 | [source, java] 14 | ---- 15 | int[][] matrix = new int[2][3]; 16 | ---- 17 | 18 | `matrix` 배열은 요소로 두 개의 정수 타입 배열을 가집니다. 따라서 `matrix` 의 `length` 는 2가 됩니다. matrix 배열이 포함하고 있는 두 배열, `matrix[0]` 과 `matrix[1]` 은 각각 3개의 요소를 가집니다. 따라서 `matrix[0]` 과 `matrix[1]` 배열의 `length` 는 3이 됩니다. 19 | 20 | --- 21 | 22 | link:./16_using_array.adoc[이전: 배열 사용] + 23 | link:./18_method_of_array.adoc[다음: 배열 메소드] -------------------------------------------------------------------------------- /course/Module06_array/contents/19_return_array.adoc: -------------------------------------------------------------------------------- 1 | = 메소드에서 배열 return 2 | 3 | * 메소드에서 배열을 return 하도록 정의 4 | 5 | [source, java] 6 | ---- 7 | class Example { 8 | public static void main(String[] args) { 9 | int[] array = createArray(7); 10 | } 11 | static int[] createArray(int size) { 12 | int[] result = new int[size]; 13 | return result; 14 | } 15 | } 16 | ---- 17 | 18 | --- 19 | 20 | `createArray` 메소드는 두 문으로 구성되었습니다. 두 줄을 합쳐서 아래와 같이 쓸 수도 있습니다: 21 | 22 | [source, java] 23 | ---- 24 | static int[] createArray(int size) { 25 | return new int[size]; 26 | } 27 | ---- 28 | 29 | C++ 프로그래머는 return 되는 배열의 크기가 정의되지 않았음에 유의해야 합니다. return 타입에 배열의 크기를 지정하면 컴파일시 오류가 발생합니다. 30 | 31 | [source, java] 32 | ---- 33 | static int[3] createArray(int size) { // 컴파일시 오류 34 | return new int[size]; 35 | } 36 | ---- 37 | 38 | --- 39 | 40 | link:./18_method_of_array.adoc[이전: 배열 메소드] + 41 | link:./20_array_as_parameter.adoc[다음: 배열을 파라미터로 전달] -------------------------------------------------------------------------------- /course/Module06_array/contents/25_review.adoc: -------------------------------------------------------------------------------- 1 | = 검토 2 | 3 | * 배열 개요 4 | * 배열 생성 5 | * 배열 사용 6 | 7 | --- 8 | 9 | Quiz. 10 | 11 | 1. int 타입 배열 `even` 을 선언하고 0부터 시작하는 처음 5개의 짝수로 초기화하세요. 12 | 2. int 타입 변수 `crowd` 를 선언하고 `even` 배열의 두 번째 변수로 초기화 하세요. 13 | 3. int 타입 배열 `copy` 를 선언하고 `even` 배열을 할당하는 코드를 두 줄로 작성하세요. 14 | 4. `createArray` 라는, 2차원 배열을 return하는 메소드를 작성하세요. 3 x 5 행렬을 return하며, 요소의 모든 값은 28로 초기화 되어야 합니다. 15 | 5. 2차원 배열을 파라미터로 받아 차원의 1차원 길이, 2차원 길이를 출력하는 메소드를 작성하세요. 16 | 6. `names` 라는 `String` 타입 배열의 모든 요소 값을 출력하는 foreach문을 작성하세요. 17 | 18 | --- 19 | 20 | link:./24_lab_6-1.adoc[이전: Lab 6-1 : 배열의 생성과 사용] -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image01.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image02.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image03.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image04.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image05.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image06.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image07.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image08.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image09.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image10.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image11.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image12.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image13.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image14.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image15.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image16.png -------------------------------------------------------------------------------- /course/Module06_array/contents/images/image17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module06_array/contents/images/image17.png -------------------------------------------------------------------------------- /course/Module06_array/homework/tictactoe.adoc: -------------------------------------------------------------------------------- 1 | = TicTacToe 게임 2 | 3 | 틱-택-토(Tic-Tac-Toe)는 두 명이 번갈아가며 `O` 와 `X` 를 3x3 보드에 써서 같은 글자를 가로, 세로 혹은 대각선 상에 놓이도록 하는 놀이이다. 4 | 5 | 아래 예시는 먼저 놓은 X가 이기는 경우이다. 6 | 7 | image::../contents/images/image17.png[] 8 | 9 | 게임 방법은 아주 간단하다. 10 | 11 | 1. 종이 위에 가로줄과 세로줄을 각각 2개씩 긋는다. 12 | 2. 이렇게 생긴 9칸 위에 1P는 `O` , 2P는 `X` 를 번갈아가며 그린다. 13 | 3. 먼저 `O` 나 `X` 를 3개가 직선 또는 대각선으로 이어지게 만들면 승리한다. 14 | 15 | 컴퓨터와 사용자가 번갈아 Turn을 수행하여 승패를 가릴 수 있는 Tic Tac Toe 게임을 작성하라. 16 | 17 | == 프로그램에서 지켜야 하는 규칙 18 | 19 | * 3 x 3 배열을 사용하여 판(board)를 그린다. 20 | * 사용자 - 컴퓨터 - 사용자 순으로 각각의 Turn을 수행한다. 21 | * Turn에서는 [X 좌표, Y 좌표] 순으로 숫자를 입력하여 수행한다. 예를 들어, 프롬프트에서 1, 1 과 같이 입력하면 board의 가운데 칸에 Turn 수행자의 마크를 표시한다. 22 | + 23 | ---- 24 | | | 25 | ----------- 26 | | O | 27 | ----------- 28 | | | 29 | ---- 30 | + 31 | * 수행하는 사용자는 X 또는 O 로 표시된 칸에 마크할 수 없다. 마크할 경우 예외 처리 방식으로 오류를 처리한다. 32 | * 컴퓨터는 컴퓨터의 Turn에 빈 칸 중 하나에 Random 방식으로 마크한다. 33 | * 각 동작은 적절히 분해하여 메소드로 만들어 수행한다. 34 | 35 | == 제출 방법 36 | 37 | * main 메소드가 포함된 클래스를 public으로 선언하고 학번_Tictactoe 로 작성한다. 38 | * 여러 클래스를 포함하는 경우, 모든 클래스를 단일 파일에 작성한다. 39 | * 학번_Tictactoe.java 소스 파일을 제출한다. (압축, 파일 분할 금지) -------------------------------------------------------------------------------- /course/Module07_oop_basic/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/.DS_Store -------------------------------------------------------------------------------- /course/Module07_oop_basic/LabFiles/Lab7-1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/LabFiles/Lab7-1.zip -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/01_OOP_basic.adoc: -------------------------------------------------------------------------------- 1 | = Module 07: 객체지향 프로그래밍 기본 2 | 3 | Java는 객체지향 언어입니다. Java 언어를 사용하면 추상화, 상속성, 캡슐화, 다형성 등의 특징을 사용하여 소프트웨어에 새로운 기능을 추가하거나 기존의 기능 변경, 기능 제거에 유연한 방법을 제공하는 재 사용성이 뛰어난 프로그램을 작성할 수 있습니다. 이 모듈에서는 Java에서 클래스를 만들고 사용하기 위한 용어와 컨셉을 학습합니다 4 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 5 | 6 | • 객체지향 프로그래밍 맥락에서 객체와 클래스를 알게 됩니다. 7 | • 객체의 세 가지 핵심인 Identity(ID), State(상태), Behavior(행위)을 이해합니다. 8 | • 추상화를 설명하고, 추상화가 유지 관리하기 쉬운 재 사용 가능한 클래스를 만드는데 어떻게 도움이 되는지 설명합니다 9 | • 캡슐화를 사용하여 단일 클래스에서 메소드와 데이터를 결합하고 추상화를 적용합니다. 10 | • Java에서 클래스를 만들고 사용합니다. 11 | 12 | == Table of Contents 13 | 14 | 1. link:./02_class_and_object.adoc[클래스(class)와 객체(object)] 15 | 2. link:./06_encapsulation.adoc[캡슐화] 16 | 3. link:./12_java_and_OOP.adoc[Java와 객체지향] 17 | 4. link:./20_oo_system.adoc[객체지향 시스템 정의] 18 | 19 | --- 20 | 21 | link:./02_class_and_object.adoc[다음: 클래스와 객체] -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/02_class_and_object.adoc: -------------------------------------------------------------------------------- 1 | = 클래스(Class)와 객체(Object) 2 | 3 | Java는 객체지향 프로그래밍 모델을 기반으로 한 구조를 가지고 있습니다. Java를 가장 효과적으로 사용하려면 객체지향 프로그래밍의 특성을 이해해야 합니다. 4 | 5 | == Table of Contents 6 | 1. link:./03_class.adoc[클래스(class)란?] 7 | 2. link:./04_object.adoc[객체(object)란?] 8 | 3. link:./05_abstraction.adoc[추상화] 9 | 10 | --- 11 | 12 | link:./01_OOP_basoc.adoc[이전: 객체지향 프로그래밍 기본] + 13 | link:./03_class.adoc[다음: 클래스(Class)란?] -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/05_abstraction.adoc: -------------------------------------------------------------------------------- 1 | = 추상화(Abstraction) 2 | 3 | * 추상화는 불필요한 것을 선택하고 제거하는 것 4 | ** 어떤 것이 중요하고 어떤 것이 중요하지 않은지에 대한 판단 5 | ** 어떤 것이 중요한지에 대해 초점을 맞추고 판단 6 | ** 어떤 것이 신뢰할 수 없고 필요 없는지에 대한 판단 7 | ** 캡슐화는 추상화의 강력한 도구 8 | 9 | --- 10 | 11 | 추상화(abstraction)는 대상에 대해 맥락에서 필요한 것에 대한 최소한의 형태가 남을 때까지 불필요한 것을 제거하는 전략입니다. 좋은 추상화는 중요하지 않은 세부 사항을 제거하고 중요한 사항들에 집중할 수 있도록 합니다. 12 | 13 | 추상화는 모든 프로그래밍에서 가장 중요한 소프트웨어 원칙입니다. 잘 설계된 클래스는 사용하기 쉽도록 클래스가 반드시 해야 하는 필수 행위들을 제공하는 최소한의 메소드를 노출합니다. 추상화는 쉽지 않습니다. 좋은 추상화를 위해서는 그 문제와 맥락에 대한 이해, 명확한 생각, 풍부한 경험이 필요합니다. 14 | 15 | == 최소한의 종속성 16 | 17 | 잘 수행된 소프트웨어 추상화는 복잡한 것을 단순하게 만듭니다. 잘된 추상화는 클래스에서 불필요한 것들을 노출하지 않습니다. 필수적이지 않은 것을 숨기면 외부에서 클래스의 불필요한 부분을 보거나 그 상태 또는 행위에 종속되지 않습니다. 18 | 19 | 최소한의 종속성은 추상화의 중요한 원칙 중의 하나입니다. 소프트웨어 개발에서 코드의 변경은 불가피합니다. 소프트웨어에 대한 완벽한 이해는 사실상 불가능합니다. 문제에 대한 완벽한 이해 없이 내려진 결정은 재 검토 후 변경되는 것이 일반적입니다. 문제에 대한 이해가 깊어질수록 코드 수정은 많아집니다. 이런 변경이 빈번하게 일어나는 소프트웨어 개발에서, 최선의 방법은 변화가 발생했을 때 그 영향을 최소화할 수 있도록 코드를 작성하는 것입니다. 이는 클래스의 특정 행위나 상태에 대한 종속성을 줄일수록 변경에 대한 영향을 최소화할 수 있습니다. 20 | 21 | --- 22 | 23 | link:./04_object.adoc[이전: 객체(Object)란?] + 24 | link:./06_encapulation.adoc[다음: 캡슐화(encapsulation)] -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/06_encapsulation.adoc: -------------------------------------------------------------------------------- 1 | = 캡슐화(encapsulation) 2 | 3 | 캡슐화는 객체지향의 중요한 원칙 하나이며, 잘 된 추상화의 강력한 도구입니다. 이 장에서는 객체지향의 캡슐화에 대해 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./07_data_method.adoc[데이터와 메소드의 결합] 8 | 2. link:./08_visibility.adoc[접근 가시성 제어] 9 | 3. link:./09_why_encapsulation.adoc[왜 캡슐화를 해야 하는가?] 10 | 4. link:./10_object_data.adoc[객체 데이터] 11 | 5. link:./11_using_static_data.adoc[정적 데이터 사용] 12 | 13 | --- 14 | 15 | link:./05_abstraction.adoc[이전: 추상화(Abstraction)] + 16 | link:./07_data_method.adoc[다음: 데이터와 메소드의 결합] -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/07_data_method.adoc: -------------------------------------------------------------------------------- 1 | = 데이터와 메소드의 결합 2 | 3 | * 데이터와 메소드를 하나의 캡슐로 결합 4 | * 캡슐 경계는 내부와 외부를 결정 5 | 6 | image:./images/image01.png[] 7 | 8 | --- 9 | 10 | 캡슐화(Encapsulation)에는 중요한 두 가지 관점이 있습니다. 11 | 12 | * 데이터와 기능을 단일 개체로 결합 13 | * 개체의 모든 멤버(메소드, 변수 등)에 대한 접근 가시성 제어 14 | 15 | == 절차적 프로그래밍 16 | 17 | 전통적인 절차적 프로그래밍은 많은 데이터와 기능을 포함합니다. C와 같은 언어로 작성된 프로그램은 함수에서 모든 데이터에 접근할 수 있습니다. 프로그램의 규모가 작을 경우 이런 접근 방식이 좋을 수 있지만 프로그램이 커질수록 문제가 발생할 여지가 높아집니다. 큰 규모의 프로그램에서 데이터의 표현이 변경되면 관련된 모든 코드를 수정해야 합니다. 어떤 기능이 다른 기능에 대한 종속성이 있으면 관련된 모든 코드를 수정해야 하기 때문에 프로그램 개발이, 특히 수정이 어려워집니다. 18 | 19 | 데이터와 함수가 분리되면 여러 다른 문제가 또한 발생할 수 있습니다. 사람의 사고는 기본적으로 추상화가 되어 있습니다. 사람이 자동차를 운전할 때 시동을 걸고 핸들을 조작하지 엔진룸을 열고 밸브에 직접 휘발유를 붓지 않습니다. 프로그램 또한 사람이 작성하고 사용하기 때문에 컴퓨터가 생각하는 방식보다는 사람이 생각하는 방식에 가까운 프로그래밍 모델을 사용하는 것이 좋습니다. 20 | 21 | == 객체지향 프로그래밍 22 | 23 | 객체지향 프로그래밍은 이런 문제를 해결하기 위해 등장했습니다. 객체지향 프로그래밍 모델을 이해하고 제대로 사용한다면 자연스럽게 높은 추상화 수준에서 객체를 만들며 사용하게 됩니다. 객체 지향 프로그래밍은 사람지향 프로그래밍이라고 불러도 될 정도로 사람이 생각하는 방식에 가까운 프로그래밍 모델을 가지고 있습니다. 24 | 객체지향 프로그래밍의 첫 번째 단계는 데이터와 기능을 단일 엔티티로 결합하는 것입니다. 25 | 26 | --- 27 | 28 | link:./06_encapsulation.adoc[이전: 캡슐화(encapsulation)] + 29 | link:./08_visibility.adoc[다음: 접근 가시성 제어] -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/10_object_data.adoc: -------------------------------------------------------------------------------- 1 | = 객체 데이터 2 | 3 | * 객체 데이터는 개별 객체에 대한 정보를 설명 4 | * 각 은행 계좌는 각 객체의 잔고를 가지고 있음 5 | * 만약 잔고가 같다면 우연 6 | 7 | image:./images/image07.png[] 8 | 9 | --- 10 | 11 | 객체 내부에서 static 데이터를 제외한 모든 데이터 항목은 각각의 객체에 대한 정보입니다. 모든 은행 계좌는 자체적으로 잔고를 가지고 있습니다. 두 잔고의 잔액이 동일하다면 그것은 우연의 일치일 뿐 같은 계좌는 아닙니다. 12 | 13 | 객체 내의 데이터는 private으로 유지되며 객체의 메소드를 통해서만 액세스 할 수 있도록 하는 것이 좋습니다. 이 캡슐화는 객체가 효과적으로 추상화되어 동작한다는 것을 의미하기도 합니다. 14 | 15 | --- 16 | 17 | link:./09_why_encapsulation.adoc[이전: 왜 캡슐화를 해야 하는가?] + 18 | link:./11_using_static_data.adoc[다음: 정적 데이터 사용] -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/11_using_static_data.adoc: -------------------------------------------------------------------------------- 1 | = 정적 메소드(Static Method) 사용 2 | 3 | * 정적 메소드(Static Method)는 정적 데이터에만 액세스 할 수 있음 4 | * 정적 메소드는 클래스에서 호출됨. 객체가 아님 5 | 6 | image:./images/image08.png[] 7 | 8 | --- 9 | 10 | 정적 데이터를 캡슐화 하기 위해서는 정적 메소드를 사용해야 합니다. 은행 예에서 이자율은 각각의 계정 객체가 아니라 클래스에 속합니다. 따라서 객체의 이자율에 액세스는 메소드를 클래스 수준에서 정의해 주어야 합니다. 11 | 12 | 데이터를 정적으로 선언하는 것과 같은 방식으로 메소드를 정적으로 선언할 수 있습니다. public 또는 private 접근 제한자를 사용하여 정적 메소드와 정적 데이터 모두에 대한 접근 가능성을 제어할 수 있습니다. `public` 정적 메소드와 `private` 정적 메소드를 선택하여, 객체 데이터를 캡슐화 하는 것과 동일한 방식으로 정적 데이터를 캡슐화 할 수 있습니다. 13 | 14 | 정적 메소드는 클래스의 모든 `private` 멤버에 대해 액세스를 유지하고 객체 참조를 통해 `private` 동적 데이터(static이 아닌 데이터)에 액세스 할 수 있습니다. 15 | 16 | [source, java] 17 | ---- 18 | class time { 19 | … 20 | public static void resetTime(time t) { 21 | t.hour = 0; 22 | t.minute = 0; 23 | hour = 0; // 컴파일시 오류 24 | minute = 0; // 컴파일시 오류 25 | } 26 | private int, minute; 27 | } 28 | ---- 29 | 30 | --- 31 | 32 | link:./10_object_data.adoc[이전: 객체 데이터] + 33 | link:./12_java_and_OOP.adoc[다음: Java와 객체지향] -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/12_java_and_OOP.adoc: -------------------------------------------------------------------------------- 1 | = Java와 객체지향 2 | 3 | 이 장에서는 Hello, World 프로그램을 다시 검토합니다. 프로그램의 구조는 객체지향의 관점에서 다시 설명됩니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./13_helloworld.adoc[Hello, World revisited] 8 | 2. link:./14_simple_class_definition.adoc[단순한 클래스 정의] 9 | 3. link:./15_instance.adoc[새 객체 인스턴스 화] 10 | 4. link:./16_this.adoc[this 키워드] 11 | 5. link:./17_nested_class.adoc[내부 클래스 정의] 12 | 6. link:./18_access_nested_class.adoc[내부 클래스에 액세스] 13 | 14 | --- 15 | 16 | link:./11_using_static_data.adoc[이전: 정적 메소드(Static Method) 사용] + 17 | link:./13_helloworld.adoc[다음: Hello, World Revisited] -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/20_oo_system.adoc: -------------------------------------------------------------------------------- 1 | = 객체지향 시스템 정의 2 | 3 | 이 단원에서는 객체지향의 가장 중요한 개념들인 상속과 다형성에 대해 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./21_inheritance.adoc[상속] 8 | 2. link:./22.hier.adoc[클래스 계층 구조] 9 | 3. link:./23_single_mult_inher.adoc[단일/다중 상속] 10 | 4. link:./24_polymorphism.adoc[다형성(Polymorphism)] 11 | 5. link:./25_abstract_class.adoc[추상 클래스(abstract class)] 12 | 6. link:./26_interface.adoc[인터페이스 (interface)] 13 | 7. link:./27_early_late_binding.adoc[이른/늦은 바인딩] 14 | 15 | --- 16 | 17 | link:./19_lab_7-1.adoc[이전: Lab 7-1 클래스를 만들고 사용] + 18 | link:./21_inheritance.adoc[다음: 상속(Inheritance)] -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/22_hier.adoc: -------------------------------------------------------------------------------- 1 | = 클래스 계층구조 2 | 3 | * 상속과 관련된 클래스는 클래스 계층 구조를 형성 4 | 5 | image:./images/image10.png[] 6 | 7 | --- 8 | 9 | 한 클래스의 서브 클래스는 그 자신이 다른 클래스의 슈퍼 클래스가 될 수 있습니다. 그림에서 `StringMusician` 클래스는 `Musician` 클래스에서 파생된 서브 클래스이지만 그 자체로 추가 파생된 `ViolinPlayer` 클래스의 슈퍼 클래스입니다. 상속으로 관련된 클래스 그룹은 클래스 계층구조(Class Hierarchy)로` 알려진 구조를 형성합니다. 계층 구조에서 위로 올라갈수록 일반적인 개념(일반화)을 나타내며 아래로 내려가면 보다 전문화된 개념(전문화)을 나타냅니다. 10 | 11 | 클래스 계층 구조의 깊이는 계층 구조의 상속 수준 수입니다. 더 깊은 클래스 계층은 얕은 클래스 계층보다 사용하기 어렵고 구현하기 더 어렵습니다. 대부분의 프로그래밍 지침에서는 깊이를 5~7개의 클래스로 제한할 것을 권장합니다. 12 | 13 | 그림은 두 개의 병렬 클래스 계층 구조를 보여줍니다. 하나는 `Musician` 이며, 다른 하나는 `MusicalInstrument` 입니다. 클래스 계층 구조를 만드는 것은 쉽지 않습니다. 클래스는 기본 클래스로 설계되어야 합니다. 상속으로 만들 수 있는 클래스 계층구조는 프레임워크의 기초가 되는 기능이며, 이를 기반으로 확장할 수 있는 모델이 됩니다. 14 | 15 | --- 16 | 17 | link:./21_inheritance.adoc[이전: 상속(Inheritance)] + 18 | link:./23_single_mult_inher.adoc[다음: 단일/다중 상속] -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/23_single_mult_inher.adoc: -------------------------------------------------------------------------------- 1 | = 단일/다중 상속 2 | 3 | * 단일 상속(Single Inheritance): 하나의 기본 클래스에서 파생됨 4 | * 다중 상속(Multiple Inheritance): 하나 또는 그 이상의 클래스에서 파생됨 5 | 6 | image:./images/image11.png[] 7 | 8 | --- 9 | 10 | 단일 상속(Single Inheritance)은 슈퍼 클래스가 하나 있을 때 발생합니다. 그림의 예에서 `Violin` 클래스는 `StringedInstrument` 하나의 클래스의 데이터와 속성을 상속하는 단일 상속의 예를 보여줍니다. 11 | 12 | 다중 상속(Multiple Inheritance)은 `StringedInstrument` 는 두 클래스에서 파생되는 다중 상속의 예를 보여줍니다. 상속은 객체지향 모델링의 가장 강력한 도구이지만, 상속은 잘못 이해되고 오용할 수 있는 모델링 도구이기도 합니다. Java는 최신 프로그래밍 언어들과 마찬가지로 다중 상속에 제한을 둡니다. 클래스는 단 하나의 클래스에서만 상속할 수 있으며, 여러 인터페이스를 상속할 수 있습니다. `Interface`, `Abstract class`, `Concrete class` 등의 용어는 이 모듈의 뒷 부분에서 다룹니다. 13 | 14 | 모든 형태의 상속, 특히 다중 상속은 동일한 객체에 대해 여러 수준에서의 행위를 제공합니다. `Violin` 개체는 `Violin` 클래스 수준에서 사용할 수 있지만 `StringedInstrument` 수준에서도 동작합니다. 15 | 16 | --- 17 | 18 | link:./22_hier.adoc[이전: 클래스 계층구조] + 19 | link:./24_polymorphism.adoc[다음: 다형성(Polymorphism)] -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/25_abstract_class.adoc: -------------------------------------------------------------------------------- 1 | = 추상 클래스(Abstract Class) 2 | 3 | * 파생되는 클래스의 기본 클래스가 되기 위해서만 존재 4 | * 이런 종류의 클래스 인스턴스를 만드는 것은 의미가 없음 5 | * 이런 클래스를 추상 클래스(abstract class)라고 부름 6 | 7 | image:./images/image13.png[] 8 | 9 | --- 10 | 11 | 일반적인 클래스 계층 구조에서 operation(메소드 이름)은 기본 클래스에서 선언되고 메소드는 기본 클래스에서 파생되는 클래스마다 다른 방식으로 구현됩니다. 기본 클래스는 계층 구조에 메소드 이름을 주기 위해서만 존재하고 이런 operation에는 구현이 필요하지 않습니다. 이런 경우 클래스는 인스턴스화 되어 객체로 존재할 이유가 없습니다. 따라서 이런 클래스의 인스턴스를 생성할 수 없도록 해야 합니다. 이런 경우 클래스는 추상 클래스(abstract class)로 표시됩니다. 12 | 13 | UML 디자인에서는 인스턴스화 될 수 없는 추상 클래스는 이름을 기울임체로 표시하거나 { abstract }를 사용해서 표시합니다. 추상 클래스가 아닌 일반 클래스는 « » 사이에 class 또는 concrete를 사용해서 인스턴스화 될 수 있는 클래스임을 표시합니다. 대부분의 객체지향 언어에는 인스턴스화 될 수 없는 클래스를 표시하는 문법이 있습니다. 14 | 15 | --- 16 | 17 | link:./24_polymorphism.adoc[이전: 다형성(Polymorphism] + 18 | link:./26_interface.adoc[다음: 인터페이스(Interace)] 19 | -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/27_early_late_binding.adoc: -------------------------------------------------------------------------------- 1 | = 이른/늦은 바인딩(Early/Late Binding) 2 | 3 | * 일반적인 메소드 호출은 컴파일시에 지정됨 4 | * 다형적 메소드 호출은 런타임시에 지정됨 5 | 6 | image:./images/image15.png[] 7 | 8 | --- 9 | 10 | 기본 타입의 operation을 통하지 않고 객체에서 직접 메소드를 호출하면 컴파일시에 메소드 호출이 지정됩니다. 이를 이른 바인딩(Early Binding) 또는 정적 바인딩(Static Binding)이라고 합니다. 11 | 간접적으로 즉 기본 타입의 operation을 통해 메소드가 호출되면 이는 런타임에 지정됩니다. 이를 늦은 바인딩(Late Binding) 또는 동적 바인딩(Dynamic Binding)이라고 합니다. 12 | 13 | 늦은 바인딩을 오케스트라의 경우에 빗대어 생각해봅시다. 지휘자가 음악가들에게 조율을 지시하는 경우, 이른 바인딩을 한다면 지휘자는 "음악가"가 아닌 "기타 연주자" 또는 "바이올린 연주자"에게 조율을 지시해야 합니다. 늦은 바인딩의 경우라면 지휘차는 “기타 연주자” 또는 “바이올린 연주자”가 아닌 “음악가”에서 조율을 지시할 수 있습니다. 지휘자는 새 연주자가 추가되더라도 여전히 "음악가"에게 조율을 지시할 수 있습니다. 14 | 15 | * 늦은 바인딩의 호출은 이른 바인딩보다 조금 느립니다. 늦은 바인딩 호출은 결과적으로 실제로 호출되는 객체를 검색하고 메소드를 찾아야 합니다. 프로그래밍 언어는 이를 효율적으로 처리하지만, 피해갈 수 없는 작업입니다. 16 | * 늦은 바인딩을 사용하면 파생된 클래스(서브클래스)를 기본 클래스로 대체할 수 있습니다. 인터페이스를 통해 operation을 호출할 수 있으며 런타임에 파생된 클래스에서 해당 메소드가 올바르게 호출됩니다. 즉, 인터페이스를 구현하는 모든 파생된 클래스는 인터페이스 타입을 대체하는 역할을 할 수 있습니다. 이는 객체지향 프로그래밍에서 매우 중요한 개념입니다. 17 | 18 | --- 19 | 20 | link:./26_interface.adoc[이전: 인터페이스(Interface)] + 21 | link:./28_review.adoc[다음: 검토] 22 | -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/28_review.adoc: -------------------------------------------------------------------------------- 1 | = 검토 2 | 3 | * 클래스와 객체 4 | * 캡슐화 5 | * Java와 객체지향 6 | * 객체지향 시스템 정의 7 | 8 | --- 9 | 10 | Quiz 11 | 12 | 1. 추상화에 대해 설명하고 소프트웨어 엔지니어링에서 추상화가 왜 중요한지 설명하세요. 13 | 2. 캡슐화의 두 원칙은 무엇입니까? 14 | 3. 객체지향 프로그래밍 관점에서 상속(Inheritance)를 설명하세요. 15 | 4. 다형성이란 무엇입니까? 이것이 이른 바인딩과 늦은 바인딩과 어떻게 연관됩니까? 16 | 5. 인터페이스, 추상 클래스, 콘크리트 클래스에 대해 비교 설명하세요. 17 | 18 | link:./27_early_late_binding.adoc[이전: 이른/늦은 바인딩(Early/Late Binding)] -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image01.png -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image02.png -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image03.png -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image04.png -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image05.png -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image06.png -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image07.png -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image08.png -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image09.png -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image10.png -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image11.png -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image12.png -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image13.png -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image14.png -------------------------------------------------------------------------------- /course/Module07_oop_basic/contents/images/image15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module07_oop_basic/contents/images/image15.png -------------------------------------------------------------------------------- /course/Module08_reference_type/LabFiles/Lab8-1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/LabFiles/Lab8-1.zip -------------------------------------------------------------------------------- /course/Module08_reference_type/LabFiles/Lab8-2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/LabFiles/Lab8-2.zip -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/01_reference_type.adoc: -------------------------------------------------------------------------------- 1 | = Module 08: 참조 타입 2 | 3 | 이 모듈에서는 Java에서 참조 타입을 사용하는 방법을 학습합니다. 4 | 5 | Java 프로그래밍 언어에서 이미 구현되어 있는 String과 같은 여러 참조 타입을 사용하는 방법에 대해 배우며, 클래스 계층 구조와 객체 타입에 대해 학습하여 값 타입과 참조 타입이 어떻게 관련되어 있는지 알 수 있으며, 참조 타입 간에 데이터를 변환하는 방법을 배우고, Wrapper 클래스를 사용하여 값 타입을 참조 유형으로 변환하는 것을 알게 됩니다. 6 | 7 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 8 | 9 | * 값 타입과 참조 타입의 차이에 대해 설명할 수 있습니다. 10 | * Exception, String과 같은 공통 참조 타입을 사용할 수 있습니다. 11 | * Object 타입이 어떻게 동작하는지 알게 되고 공통 메소드를 사용할 수 있습니다. 12 | * Java에서 제공하며 많이 사용되는 패키지에 대해 알게 됩니다. 13 | * 참조 타입간의 타입 변환에 대해 알게 됩니다. 14 | * Wrapper 클래스를 사용하여 값 타입을 참조 타입으로 Boxing하고 Unboxing 할 수 있습니다. 15 | 16 | == Table of contents 17 | 18 | 1. link:./02_reference.adoc[참조 타입] 19 | 2. link:./09_enum.adoc[enum 타입] 20 | 3. link:./14_common_ref_type.adoc[공통 참조 타입] 21 | 4. link:./20_object_hier.adoc[객체 계층구조] 22 | 5. link:./23_java_package.adoc[Java 패키지] 23 | 6. link:./30_type_casting.adoc[타입 변환] 24 | 25 | --- 26 | 27 | link:./02_reference.adoc[다음: 참조 타입] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/02_reference.adoc: -------------------------------------------------------------------------------- 1 | = 참조 타입 2 | 3 | 참조 타입은 Java와 같은 객체지향 언어에서 아주 중요한 기능입니다. 이를 통해 객체의 상호작용을 기반으로 한 응용 프로그램을 작성하고, 효과적으로 실행할 수 있습니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03_comparision.adoc[값 타입과 참조 타입 비교] 8 | 2. link:./04_declare_release.adoc[참조 타입 변수의 선언과 해제] 9 | 3. link:./05_ref_variable.adoc[초기화되지 않은 참조 타입 변수] 10 | 4. link:./06_comparision.adoc[값 타입의 비교와 참조 타입의 비교] 11 | 5. link:./07_same_ref.adoc[같은 객체에 대한 여러 변수의 참조] 12 | 6. link:./08_ref_as_parameter.adoc[메소드 파라미터에 참조 타입 사용] 13 | 14 | --- 15 | 16 | link:./01_reference_type.adoc[이전: 참조타입] + 17 | link:./03_comparision.adoc[다음: 값 타입과 참조타입 비교] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/03_comparision.adoc: -------------------------------------------------------------------------------- 1 | = 값 타입과 참조 타입 비교 2 | 3 | * 값 타입(Value Type) 4 | ** 데이터를 직접 포함 5 | ** 복사된, 직접 가지는 데이터를 저장 6 | + 7 | ---- 8 | int value; 9 | value = 100; 10 | ---- 11 | + 12 | image:./images/image01.png[] 13 | 14 | * 참조 타입(Reference Type) 15 | ** 데이터(객체)가 있는 곳의 위치를 저장 16 | ** 데이터는 분리된 메모리 영역에 저장됨 17 | + 18 | ---- 19 | String value; 20 | Value = “Hello” 21 | ---- 22 | image:./images/image02.png[] 23 | 24 | --- 25 | 26 | Java는 int, long, byte와 같은 기본 데이터 타입(primitive data type)을 제공합니다. 이 타입들은 값 타입(Value Type)이라고도 부릅니다. Java와 같은 객체지향 언어는 복잡하고 강력한 데이터를 처리하기 위해 참조 타입(Reference Type)을 제공합니다. 27 | 28 | * 값 타입(Value Type) + 29 | 값 타입 변수는 자바에서 제공하는 8개의 기본 데이터 타입입니다. 값 타입 변수는 단순하게 동작하며, 선언된 변수는 변수 자체에 저장됩니다. 30 | * 참조 타입(Reference Type) + 31 | 참조 타입은 데이터가 아닌 데이터가 저장된 곳의 위치 값을 저장합니다. 데이터는 분리된 메모리 공간에 저장됩니다. 32 | 33 | 앞에서 사용했던 String, 배열, 예외는 모두 Java가 기본적으로 제공하는 참조 타입에 해당합니다. 실습에서 알 수 있듯이 Java에서는 사용자 정의 클래스를 만들어 인스턴스화 하여 객체로 사용할 수 있고, 이런 종류의 객체는 모두 참조 타입으로 동작합니다. 34 | 35 | --- 36 | 37 | link:./02_reference.adoc[이전: 참조 타입] + 38 | link:./04_declare_release.adoc[다음: 참조 타입 변수의 선언과 해제] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/09_enum.adoc: -------------------------------------------------------------------------------- 1 | = enum 타입 2 | 3 | 데이터 중에서는 몇 가지로 한정된 값을 같는 경우가 많습니다. Java에서는 이런 데이터를 열거형 상수로 선언해서 한 가지 값만을 사용하도록 하는 enum 타입을 지원합니다. 이 장에서는 enum을 만들고 사용하는 방법을 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./10_declare_enum.adoc[enum 타입 선언] 8 | 2. link:./11_enum_value_compare.adoc[enum 값 비교] 9 | 3. link:./12_enum_method.adoc[enum 타입 메소드] 10 | 11 | --- 12 | 13 | link:./08_ref_as_parameter.adoc[이전: 메소드 파라미터에 참조 타입 사용] + 14 | link:./10_declare_enum.adoc[다음: enum 타입 선언] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/14_common_ref_type.adoc: -------------------------------------------------------------------------------- 1 | = 공통 참조 타입 2 | 3 | Java는 많은 참조 타입 클래스를 미리 만들어 가지고 있습니다. 이 장에서는 많이 사용되는 공통 참조 타입인 Exception 클래스와 String 클래스에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./15_exception_class.adoc[Exception 클래스] 8 | 2. link:./16_string_class.adoc[String 클래스] 9 | 3. link:./17_string_method_operator.adoc[String 클래스의 메소드, 연산자] 10 | 4. link:./18_string_compariaion.adoc[String 비교] 11 | 5. link:./19_string_compare_operator.adoc[String 비교 연산자] 12 | 13 | --- 14 | 15 | link:./13_enum_constructor.adoc[이전: enum 생성자] + 16 | link:./15_exception_class.adoc[다음: exception 클래스] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/15_exception_class.adoc: -------------------------------------------------------------------------------- 1 | = Exception 클래스 2 | 3 | * Exception은 클래스로 구현됨 4 | * Exception 객체는 예외를 발생시키는데 사용됨 5 | ** new 연산자를 사용해서 Exception 객체 생성 6 | ** throw 키워드를 사용해서 객체를 던짐 7 | * 모든 Exception 타입은 Exception 클래스에서 파생된 서브 클래스 8 | 9 | --- 10 | 11 | Exception 객체를 생성하거나 던져서 예외를 발생시킬 수 있습니다. 12 | 13 | * Exception 클래스 + 14 | Exception은 Java가 제공하는 클래스의 이름입니다. 15 | * Exception 객체 + 16 | Exception 타입 객체만이 throw 문을 사용하여 예외로 던져질 수 있고 catch문으로 잡을 수 있습니다. Exception 객체는 다른 참조 타입과 동일합니다. 17 | * Exception 타입 + 18 | Exception은 프로그램의 일반적인 오류를 나타냅니다. Exception에서 파생된 특정한 상황에 대처할 수 있는 Exception 타입이 존재합니다. (예: ClassCastException) 19 | 20 | --- 21 | 22 | link:./14_common_ref_type.adoc[이전: 공통 참조 타입] + 23 | link:./16_string_class.adoc[다음: String 클래스] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/16_string_class.adoc: -------------------------------------------------------------------------------- 1 | = String 클래스 2 | 3 | * 여러 개의 유니코드 데이터 4 | * 읽기만 하고 변경할 수 없는 불변 클래스(Immutable class) 5 | * 배열 형태로 액세스 할 수 없음 6 | 7 | [source, java] 8 | ---- 9 | String s = new String(“Hello”); 10 | char c = s[0]; // 컴파일시 오류 발생 11 | ---- 12 | 13 | --- 14 | 15 | C/C++에서는 문자열 처리를 위해 `char` 배열을 사용하지만, Java는 C#에서처럼 문자열을 처리하기 위한 `String` 클래스를 제공합니다. `String` 타입은 여러 문자의 유니코드 데이터를 처리하는데 사용됩니다. 16 | 17 | `String` 클래스는 변경할 수 없는 문자열을 나타냅니다. 이런 클래스를 불변 클래스(Immutable class)라고 합니다. String 클래스의 문자열은 생성된 뒤 변경할 수 없습니다. 문자열 값을 변경할 수 있는 몇몇 메소드는 `String` 객체의 값을 변경하는 것이 아니라 변경된 값을 포함하는 새 `String` 객체를 return합니다. 18 | 19 | |=== 20 | |**TIP** `StringBuffer` 또는 `StringBuilder` 클래스는 `String` 클래스와 함께 사용됩니다. 이 두 클래스는 문자열을 내부 수정을 가능하게 합니다. 이 클래스들은 수정을 위해 반복적으로 객체를 생성하는 번거로움을 없앱니다. 21 | |=== 22 | 23 | `java.lang` 패키지에 포함된 `String` 클래스는 문자열 조작을 위한 유용한 메소드들을 포함하고 있습니다. 24 | 25 | --- 26 | 27 | link:./15_exception_class[이전: Exception 클래스] + 28 | link:./17_string_method_operator.adoc[다음: String 클래스 메소드, 연산자] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/20_object_hier.adoc: -------------------------------------------------------------------------------- 1 | = 객체 계층 구조 2 | 3 | Java의 모든 클래스는 java.lang.Object에서 파생된, Object 클래스의 서브 클래스입니다. 이 단원에서는 Java 객체들의 계층 구조에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./21_object_type.adoc[Object 타입] 8 | 2. link:./22_common_method.adoc[공통 메소드] 9 | 10 | --- 11 | 12 | link:./19_string_compare_operator.adoc[이전: String 비교 연산자] + 13 | link:./21_object_type.adoc[다음: Object 타입] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/21_object_type.adoc: -------------------------------------------------------------------------------- 1 | = Object 타입 2 | 3 | * java.lang.Object 4 | * 모든 클래스의 슈퍼 클래스 5 | 6 | image:./images/image11.png[] 7 | 8 | --- 9 | 10 | Object 타입은 Java 프로그래밍에서 직접 만들거나 대부분의 Java가 제공하는 클래스의 슈퍼 클래스가 되는 기본 타입입니다. 11 | 12 | == Object 클래스 13 | 14 | `Object` 는 `java.lang` 패키지에 포함된 클래스로, 프로그래밍시에 사용되는 모든 클래스의 기본이 되는 슈퍼클래스입니다. 따라서, Java의 모든 클래스는 `Object` 로 암시적 타입 변환이 가능합니다. 15 | 16 | [source, java] 17 | ---- 18 | String title = "Top Gun"; 19 | Object o = title; 20 | System.out.println(o.getClass().getName()); 21 | ---- 22 | 23 | == 슈퍼 클래스 24 | 25 | 모든 클래스는 직접적 또는 간접적으로 `Object` 클래스에서 상속됩니다. 여기에는 프로그래머가 직접 작성하는 클래스와 Java가 제공하는 클래스의 대부분이 포함됩니다. 클래스를 선언할 때 명시적으로 상속을 명시하지 않으면 `Object` 를 상속하는 클래스가 됩니다. 26 | 27 | link:./20_object_hier.adoc[이전: 객체 계층 구조] + 28 | link:./22_common_method.adoc[다음: 공통 메소드] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/23_java_package.adoc: -------------------------------------------------------------------------------- 1 | = Java 패키지 2 | 3 | Java의 패키지는 비슷한 성격의 클래스들을 모아 놓은 디렉토리입니다. Java는 클래스들을 여러 이름공간으로 정리하며, 소속된 각 타입에 대해 고유한 이름 공간들을 제공합니다. 이 장에서는 Java 패키지의 동작 방법과 Java에서 제공되는 클래스들을 제공하는 패키지를 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./24_overview_java_package.adoc[Java 패키지] 8 | 2. link:./25_java_lang_package.adoc[java.lang 패키지] 9 | 3. link:./26_java_util_package.adoc[java.util 패키지] 10 | 4. link:./27_java_io_package.adoc[java.io 패키지] 11 | 5. link:./28_other_package.adoc[기타 유용한 패키지] 12 | 13 | --- 14 | 15 | link:./22_common_method.adoc[이전: 공통 메소드] + 16 | link:./24_overview_java_package.adoc[다음: Java 패키지 개요] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/25_java_lang_package.adoc: -------------------------------------------------------------------------------- 1 | = java.lang 패키지 2 | 3 | * import 없이 사용가능한 기본 패키지 4 | ** Integer, Long, Float, Double 등의 Wrapper 클래스 5 | ** 문자열과 관련된 String, StringBuffer, StringBuilder 클래스 6 | ** 표준 입출력을 위한 System.in, System.out 스트림 7 | ** Thread 관련 주요 클래스 8 | ** 이외 다양한 클래스와 인터페이스 포함 9 | 10 | --- 11 | 12 | `java.lang` 패키지는 모든 클래스의 기본 클래스가 되는 Object 클래스가 포함된 주요 패키지이며, import 문으로 사용을 명시하지 않아도 사용할 수 있습니다. java.lang 패키지에는 아래와 같은 클래스들이 포함되어 있습니다. 13 | 14 | * Boolean, Byte, Short, Integer, Long, Float, Double등 기본형 타입을 객체로 변환시킬 때 사용하는 Wrapper 클래스 15 | * String, StringBuffer, StringBuilder 클래스 등 문자열과 관련된 클래스 16 | * 표준 입출력을 위한 System.in, System.out 스트림 17 | * 수학 관련 연산을 위한 Math 클래스 18 | * Thread와 관련된 클래스 19 | 20 | --- 21 | 22 | link:./24_overview_java_package.adoc[이전: Java 패키지] + 23 | link:./26_java_util_package.adoc[다음: java.util 패키지] 24 | -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/27_java_io_package.adoc: -------------------------------------------------------------------------------- 1 | = java.io 패키지 2 | 3 | * 파일이나 통신 등 정보의 입출력을 처리하는 클래스가 포함된 패키지 4 | ** 파일 시스템의 파일 정보를 얻기 위한 `File` 클래스 5 | ** 콘솔에서 문자를 입출력하기 위한 `Console` 클래스 6 | ** `InputStream`, `OutputStream` 클래스 등 바이트 단위 입출력을 위한 스트림 추상 클래스 7 | ** `FileInputStream`, `FileOutputStream` 등 바이트 단위 입출력을 위한 스트림 클래스 8 | ** `Reader`, `Writer` 등 문자 단위 입출력을 위한 스트림 추상 클래스 9 | ** `FileReader`, `FileWriter` 등 문자 단위 입출력을 위한 하위 스트림 클래스 10 | ** 그 외 입출력을 위한 다양한 클래스 포함 11 | 12 | --- 13 | 14 | java.io 패키지는 파일이나 통신, 입 출력 등에 관련된 작업을 처리하는 클래스가 포함되어 있습니다. 15 | 16 | --- 17 | 18 | link:./26_java_util_package.adoc[이전: java.util 패키지] + 19 | link:./28_other_package.adoc[다음: 기타 유용한 패키지] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/28_other_package.adoc: -------------------------------------------------------------------------------- 1 | = 기타 유용한 패키지 2 | 3 | * java.net 패키지 4 | * javafx 패키지 5 | * Java 버전에 따라 많은 유용한 패키지들이 포함되고 버전업 됨 6 | 7 | --- 8 | 9 | java에서는 `java.lang`, `java.util`, `java.io` 외에도 빠르고 안전한 프로그래밍을 위한 수 많은 클래스 라이브러리를 패키지로 제공합니다. 10 | 11 | == java.net 패키지 12 | 13 | 네트워크 응용 프로그램을 구현하기 위한 클래스를 제공합니다. 14 | * INetAddress + 15 | TCP/IP 네트워크 IP 주소를 표현하고 다루는 클래스입니다. 16 | * URL + 17 | TCP/IP 네트워크의 URL을 표현하고 다루는 클래스입니다. 18 | * URLConnection + 19 | 응용 프로그램과 URL간의 통신 연결을 나타내는 추상 클래스입니다. 20 | * Socket + 21 | 프로세스간의 통신을 담당하며, 스트림을 통해 프로세스간 통신을 담당하는 클래스입니다. 22 | * ServerSocket + 23 | 포트와 연결되어 외부의 연결 요청을 기다리다 연결 요청이 오면 Socket을 생성해서 소켓 간 통신이 이루어지도록 연결을 담당하는 클래스입니다. 24 | 25 | == javafx 패키지 26 | 27 | JavaFX는 Java 프로그래밍 언어로 데스크톱 응용 프로그램과 RIA(Rich Internet Application)를 개발하고 배포하기 위판 소프트웨어 플랫폼입니다 JavaFX는 Swing을 대체하기 위해 개발되었으며, Microsoft Windows, Linux, macOS에서 사용할 수 있습니다. JavaFX는 JDK에 포함되어 있지 않아 따로 설치해야 하며, javafx.* 패키지로 제공됩니다. 28 | 29 | --- 30 | 31 | link:./27_java_io_package.adoc[이전: java.io 패키지] + 32 | link:./29_lab_8-1.adoc[다음: Lab 8-1 참조 타입 변수를 선언하고 사용] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/30_type_casting.adoc: -------------------------------------------------------------------------------- 1 | = 타입 변환 2 | 3 | 이 단원에서는 Java에서 참조 타입의 타입 변환에 대해 배웁니다. 참조 타입은 다른 타입으로 변환될 수 있지만, 반드시 변환되는 객체사이에 관계가 있어야 합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./31_wrapper_class.adoc[Wrapper 클래스] 8 | 2. link:./32_boxing_unboxing.adoc[Boxing과 Unboxing] 9 | 3. link:./33_super_sub_casting.adoc[슈퍼 클래스/서브 클래스 변환] 10 | 4. link:./34_instanceof.adoc[Instanceof 연산자] 11 | 5. link:./35_object_casting.adoc[Object 타입 변환] 12 | 6. link:./36_interface_casting.adoc[인터페이스 타입 변환] 13 | 14 | --- 15 | 16 | link:./29_lab_8-1.adoc[이전: 8-1: 참조 타입 변수를 선언하고 사용] + 17 | link:./31_wrapper_class.adoc[다음: Wrapper 클래스] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/32_boxing_unboxing.adoc: -------------------------------------------------------------------------------- 1 | = Boxing과 Unboxing 2 | 3 | * Wrapper 클래스는 산술 연산을 위해 정의되지 않음 4 | * 값을 변경할 수 없음 5 | * 기본 데이터 타입을 Wrapper 클래스 인스턴스로 변환: Boxing 6 | * Wrapper 클래스 인스턴스를 기본 데이터 타입으로 변환: Unboxing 7 | 8 | --- 9 | 10 | Wrapper 클래스는 산술 연산을 위해 정의된 클래스가 아니므로, 인스턴스에 저장된 값을 변경할 수 없습니다. Value world의 값을 Reference world로 가져가서 객체처럼 사용하기 위한 목적으로 사용되어, 생성된 인스턴스의 값을 참조만 할 수 있습니다. 11 | 12 | image:./images/image12.png[] 13 | 14 | 위 그림과 같이 기본 데이터 타입을 Wrapper 클래스의 인스턴스로 변환하는 과정을 Boxing이라고 하며, 반대로 Wrapper 클래스를 기본 데이터 타입으로 변환하는 과정을 Unboxing이라고 합니다. 15 | 16 | [source, java] 17 | ---- 18 | Integer number = new Integer(20); // Boxing 19 | int i = number.intValue(); // Unboxing 20 | ---- 21 | 22 | == Auto Boxing, Auto Unboxing 23 | 24 | Java 컴파일러는 Boxing과 Unboxing이 필요한 상황이 되면 이 작업 자동으로 처리합니다. 이런 자동화된 Boxing과 Unboxing을 Auto Boxing, Auto Unboxing이라고 합니다. 25 | 26 | [source, java] 27 | ---- 28 | Integer number = 1; 29 | int i = number; 30 | ---- 31 | 32 | --- 33 | 34 | link:./31_wrapper_class.adoc[이전: Wrapper 클래스] + 35 | link:./33_super_sub_casting.adoc[다음: 슈퍼클래스/서브클래스 변환] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/35_object_casting.adoc: -------------------------------------------------------------------------------- 1 | = Object 타입 변환 2 | 3 | * Object는 모든 클래스의 기본 클래스 4 | * 모든 참조 타입은 Object로 변환 가능 5 | * 모든 객체는 Object에 할당될 수 있음 6 | 7 | [source, java] 8 | ---- 9 | Object o; 10 | o = iron; 11 | o = (Object)iron; 12 | ---- 13 | 14 | --- 15 | 16 | 모든 참조 타입은 `Object` 클래스를 상속합니다. 이는 모든 참조 타입은 Object 타입으로 변환 될 수 있다는 것을 의미합니다. 17 | 18 | == 모든 참조 타입은 `Object` 타입에 할당될 수 있습니다. 19 | 20 | 모든 클래스는 직접적으로 또는 간접적으로 Object 타입에서 상속됩니다. 따라서 어떠한 참조 타입이든 Object 객체에 암시적/명시적 방법으로 할당될 수 있습니다. 21 | 22 | [source, java] 23 | ---- 24 | Object object; 25 | IronMan ironMan = new IronMan(); 26 | object = ironMan; 27 | object = (Object)ironMan; 28 | ---- 29 | 30 | == instanceof 연산자와 Object 31 | 32 | 모든 경우에 `true` 를 반환합니다. 33 | 34 | [source, java] 35 | ---- 36 | ironMan instanceof Object; // true 37 | ---- 38 | 39 | --- 40 | 41 | link:./34_instanceof.adoc[이전: instanceof 연산자] + 42 | link:./36_interface_casting.adoc[다음: 인터페이스 타입 변환] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/36_interface_casting.adoc: -------------------------------------------------------------------------------- 1 | = 인터페이스 타입 변환 2 | 3 | * 인터페이스는 인터페이스에 정의된 멤버에 액세스 하는 데만 사용됨 4 | * 인터페이스에서 파생된 클래스에 정의된 메소드 및 변수는 인터페이스를 통해 액세스 할 수 없음 5 | 6 | --- 7 | 8 | 클래스가 인터페이스를 구현하는 경우에도(즉, 인터페이스의 서브타입인 경우에도) 같은 방법으로 타입을 변환할 수 있습니다. 아래와 같은 인터페이스 타입이 있으면, 9 | 10 | [source, java] 11 | ---- 12 | IFlyable canFly; 13 | ---- 14 | 15 | 클래스에서와 같은 방법으로 타입을 변환할 수 있습니다. 16 | 17 | [source, java] 18 | ---- 19 | IFlyable canFly; 20 | IronMan ironMan = new IronMan(); 21 | canFly = ironMan; 22 | ---- 23 | 24 | 인터페이스의 타입 변환에서도 런타임 타입 변환에 실패하면 ClassCaseException이 발생하며, 클래스에서와 같은 방법으로 instanceof 연산자를 사용할 수 있습니다. 25 | 26 | [source, java] 27 | ---- 28 | if (ironMan instanceof IFlyable) // true 29 | ---- 30 | 31 | --- 32 | 33 | link:./35_object_casting.adoc[이전: Object 타입 변환] + 34 | link:./37_lab_8-2.adoc[다음: Lab 8-2 타입 변환] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/38_review.adoc: -------------------------------------------------------------------------------- 1 | = 검토 2 | 3 | * 참조 타입 4 | * 공통 참조 타입 5 | * 객체 계층 구조 6 | * Java 패키지 7 | * 타입 변환 8 | 9 | --- 10 | 11 | Quiz 12 | 13 | 1. 참조 타입의 메모리 할당 및 할당 해제 방법을 설명하세요. 14 | 2. 참조 타입 변수가 객체를 가리키고 있지 않은 경우 나타나는 값은 무엇인가요? 이런 변수에 액세스하면 어떻게 되나요? 15 | 3. String 클래스의 특징에 대해 설명하세요. 16 | 4. 모든 클래스의 기본 클래스는 무엇인가요? 17 | 5. Object 객체의 메소드를 설명하세요. 18 | 19 | --- 20 | 21 | link:./37_lab_8-2.adoc[이전: Lab 8-2 타입변환] -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/contents/images/image01.png -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/contents/images/image02.png -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/contents/images/image03.png -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/contents/images/image04.png -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/contents/images/image05.png -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/contents/images/image06.png -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/contents/images/image07.png -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/contents/images/image08.png -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/images/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/contents/images/image09.png -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/contents/images/image10.png -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/images/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/contents/images/image11.png -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/images/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/contents/images/image12.png -------------------------------------------------------------------------------- /course/Module08_reference_type/contents/images/image13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module08_reference_type/contents/images/image13.png -------------------------------------------------------------------------------- /course/Module09_object_creation_deletion/LabFiles/Lab9-1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module09_object_creation_deletion/LabFiles/Lab9-1.zip -------------------------------------------------------------------------------- /course/Module09_object_creation_deletion/contents/01_object_creation_destroy.adoc: -------------------------------------------------------------------------------- 1 | = Module 09: 객체 생성과 제거 2 | 3 | 이 모듈에서는 객체가 생성될 때 발생하는 일과 객체가 생성될 때 생성자를 사용하여 객체를 초기화하는 방법, 그리고 객체의 사용이 종료되면 객체를 제거하고 메모리를 회수하는 방법을 배웁니다. 객체가 제거될 때 어떤 일이 발생하고 가비지 컬렉션의 동작을 알게 됩니다. 4 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 5 | 6 | • 생성자를 사용하여 객체를 생성합니다. 7 | • 다양한 파라미터를 사용할 수 있는 오버로드 된 생성자를 생성합니다. 8 | • 객체의 생명주기를 설명하고 객체가 제거될 때 일어나는 일을 설명합니다. 9 | • 객체를 제거하도록 알리는 방법을 알게 됩니다 10 | 11 | == Table of contents 12 | 13 | 1. link:./02_constructor.adoc[생성자] 14 | 2. link:./08_initializer_list.adoc[데이터 초기화] 15 | 3. link:./13_object_and_memory.adoc[객체와 메모리] 16 | 17 | --- 18 | 19 | link:./02_constructor.adoc[다음: 생성자] -------------------------------------------------------------------------------- /course/Module09_object_creation_deletion/contents/02_constructor.adoc: -------------------------------------------------------------------------------- 1 | = 생성자 2 | 3 | 생성자는 특수한 형태의 메소드로, 객체 생성시에 객체를 초기화하는데 사용됩니다. 4 | 5 | 이 장에서는 생성자를 사용하여 객체를 초기화하는 방법을 학습합니다. 6 | 7 | == Table of Contents 8 | 9 | 1. link:./03_object_creation.adoc[객체 생성] 10 | 2. link:./04_using_default_constructor.adoc[기본 생성자] 11 | 3. link:./05_defailt_constructor_overriding.adoc[생성자 오버라이딩] 12 | 4. link:./06_constructor_overloadng.adoc[생성자 오버로딩] 13 | 14 | --- 15 | 16 | link:./01_object_creation_destroy.adoc[이전: 객체 생성과 제거] + 17 | link:./03_object_creation.adoc[다음: 객체 생성] -------------------------------------------------------------------------------- /course/Module09_object_creation_deletion/contents/07_initiate_data.adoc: -------------------------------------------------------------------------------- 1 | = 데이터 초기화 2 | 3 | 생성자는 파라미터를 사용하여 데이터를 초기화 할 수 있습니다. 생성자는 이외에도 여러 기능을 가질 수 있습니다. 이 장에서는 요구에 맞는 생성자를 작성하는 방법에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./08_initializer_list.adoc[초기화 목록] 8 | 2. link:./09_declare_constant.adoc[상수 선언] 9 | 3. link:./10_private_constructor.adoc[private 생성자] 10 | 4. link:./11_static_constructor.adoc[static 생성자] 11 | 12 | --- 13 | 14 | link:./06_constructor_overloadng.adoc[이전: 생성자 오버로딩] + 15 | link:./08_initializer_list.adoc[다음: 초기화 목록] -------------------------------------------------------------------------------- /course/Module09_object_creation_deletion/contents/09_declare_constant.adoc: -------------------------------------------------------------------------------- 1 | = 상수 선언 2 | 3 | * 상수는 컴파일시에 초기화 됨 4 | * final 키워드를 사용하여 선언 5 | 6 | --- 7 | 8 | 상수는 생성자와는 별도로 초기화 됩니다. 상수 변수는 절대로 변하지 않는 값을 나타내며, final 키워드를 사용하여 정의됩니다. 9 | 10 | [source, java] 11 | ---- 12 | final double pi = 3.14; 13 | ---- 14 | 15 | 상수를 이용하여 원의 넓이를 구하는 메소드를 아래와 같이 작성할 수 있습니다. 16 | 17 | [source, java] 18 | ---- 19 | public class Calculator { 20 | final double pi = 3.14; 21 | public double getAreaOfCircle(double radius) { 22 | return radius * radius * pi; 23 | } 24 | } 25 | ---- 26 | 27 | 종속성이 순환 특성이 아니라면 동일한 프로그램 내의 다른 상수에 종속될 수 있습니다. 컴파일러는 적절한 순서로 상수 선언을 자동으로 평가합니다. 28 | 29 | [source, java] 30 | ---- 31 | public class Calculator { 32 | final double pi = 3.14; 33 | final double tau = pi * 2; 34 | 35 | public double getAreaOfCircle(double radius) { 36 | return radius * radius * pi; 37 | } 38 | 39 | public double getCircumference(double radius) { 40 | return radius * tau; 41 | } 42 | } 43 | ---- 44 | 45 | --- 46 | 47 | link:./08_initializer_list.adoc[이전: 초기자 목록] + 48 | link:./10_private_constructor.adoc[다음: private 생성자] -------------------------------------------------------------------------------- /course/Module09_object_creation_deletion/contents/11_static_constructor.adoc: -------------------------------------------------------------------------------- 1 | = static 생성자 2 | 3 | * static 생성자는 객체 인스턴스가 생성되기 전에 동작됨 4 | ** static 필드를 초기화 함 5 | * Java는 static 생성자를 지원하지 않음 6 | 7 | --- 8 | 9 | Java 프로그래밍 언어는 static 생성자를 지원하지 않습니다. 10 | 11 | --- 12 | 13 | link:./10_private_constructor.adoc[이전: private 생성자] + 14 | link:./12_lab_9-1.adoc[다음: Lab 9-1 객체 생성] -------------------------------------------------------------------------------- /course/Module09_object_creation_deletion/contents/13_object_and_memory.adoc: -------------------------------------------------------------------------------- 1 | = 객체와 메모리 2 | 3 | 응용 프로그램의 객체에서 값, 생명주기에 관련하여 어떤 일이 일어나는지 알아야 할 필요가 있습니다. 이 장에서는 객체와 메모리에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./14_object_lifecycle.adoc[객체 생명주기] 8 | 2. link:./15_object_and_scope.adoc[객체와 범위] 9 | 3. link:./16_garbage_collection.adoc[가비지 컬렉션] 10 | 11 | --- 12 | 13 | link:./12_lab_9-1.adoc[이전: Lab 9-1 객체 생성] + 14 | link:./14_object_lifecycle.adoc[다음: 객체 생명주기] -------------------------------------------------------------------------------- /course/Module09_object_creation_deletion/contents/17_review.adoc: -------------------------------------------------------------------------------- 1 | = 검토 2 | 3 | * 생성자 4 | * 데이터 초기화 5 | * 객체와 메모리 6 | 7 | --- 8 | 9 | == Quiz 10 | 11 | 1. Time 클래스를 선언하고 hour, minute, second 세 파라미터를 가지는 생성자를 가지는 코드를 작성하세요. 12 | 2. 컴파일러는 Time 클래스의 기본 생성자를 생성합니까? 13 | 3. try-with-resource문의 목적은 무엇입니까? 14 | 15 | link:./16_garbage_collection.adoc[이전: 가비지 컬렉션] -------------------------------------------------------------------------------- /course/Module09_object_creation_deletion/readme.adoc: -------------------------------------------------------------------------------- 1 | = Module 09 객체 생성과 제거 2 | 3 | link:./contents/01_object_creation_destroy.adoc[이전: 객체 생성과 제거] 4 | 5 | * link:./contents/02_constructor.adoc[Chapter 1: 생성자] 6 | ** link:./contents/03_object_creation.adoc[객체 생성] 7 | ** link:./contents/04_using_default_constructor.adoc[기본 생성자 사용] 8 | ** link:./contents/05_defailt_constructor_overloading.adoc[생성자 오버라이딩] 9 | ** link:./contents/06_constructor_overloadng.adoc[생성자 오버로딩] 10 | * link:./contents/07_initiate_data.adoc[Chapter 2: 데이터 초기화] 11 | ** link:./contents/08_initializer_list.adoc[초기화 목록] 12 | ** link:./contents/09_declare_constant.adoc[상수 선언] 13 | ** link:./contents/10_private_constructor.adoc[private 생성자] 14 | ** link:./contents/11_static_constructor.adoc[다음: static 생성자] 15 | * link:./contents/12_lab_9-1.adoc[다음: Lab 9-1 객체 생성] 16 | * link:./contents/13_object_and_memory.adoc[Chapter 3: 객체와 메모리] 17 | ** link:./contents/14_object_lifecycle.adoc[객체 생명주기] 18 | ** link:./contents/15_object_and_scope.adoc[객체와 범위] 19 | ** link:./contents/16_garbage_collection.adoc[가비지 컬렉션] 20 | * link:./contents/17_review.adoc[검토] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/LabFiles/Lab10-1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module10_inheritance_in_java/LabFiles/Lab10-1.zip -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/LabFiles/Lab10-2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module10_inheritance_in_java/LabFiles/Lab10-2.zip -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/LabFiles/Lab10-3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module10_inheritance_in_java/LabFiles/Lab10-3.zip -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/LabFiles/Lab10-A.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module10_inheritance_in_java/LabFiles/Lab10-A.zip -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/01_inheritance_in_java.adoc: -------------------------------------------------------------------------------- 1 | = Module 10: Java에서의 상속 2 | 3 | 객체 지향 시스템에서 상속은 부모 객체로부터 데이터의 기능을 물려받는 객체의 능력입니다. 상속을 이용하면 자식 개체가 부모 개체를 대체할 수 있습니다. 상속을 사용하면 클래스를 처음부터 새로 생성하는 대신 기존 클래스에서 클래스를 생성하고, 기능을 추가하여 새 클래스를 생성할 수 있습니다. 새 클래스의 기반이 되는 부모 클래스를 슈퍼 클래스(Super Class), 기본 클래스(Base Class) 등으로 부르터 자식 클래스를 파생 클래스(Derived Class) 또는 서브 클래스(Sub Class)라고 부릅니다. 4 | 5 | 서브 클래스를 만들 때 서브 클래스가 슈퍼 클래스를 대체할 수 있음을 이해하는 것이 중요합니다. 상속은 코드 재사용 메커니즘이며, 또한 타입 분류 메커니즘입니다. 상속의 가장 중요한 개념은 코드 재사용에 있습니다. 6 | 7 | 이 모듈에서는 슈퍼 클래스에서 클래스를 파생시키는 방법을 배웁니다. 또한 슈퍼 클래스에서 정의한 메소드를 서브 클래스에서 재정의 하여 구현하는 방법을 배웁니다. 또한 클래스에서 자식 클래스가 파생되는 것을 막는 방법을 알아보며 서브 클래스가 준수해야하는 제약조건을 정의하는 인터페이스 및 추상 클래스를 구현하는 방법을 배웁니다. 8 | 9 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 10 | 11 | * 슈퍼 클래스에서 새 클래스를 파생하고 서브 클래스에서 슈퍼 클래스의 멤버와 생성자를 호출합니다. 12 | * 슈퍼 클래스의 메소드를 오버라이드 합니다. 13 | * 파생 방지 클래스를 선언합니다. 14 | * 인터페이스에 정의된 메소드를 구현합니다. 15 | * 추상 클래스를 선언하고 사용합니다. 16 | 17 | == Table of contents 18 | 19 | 1. link:./02_write_subclass.adoc[서브 클래스 작성] 20 | 2. link:./07_method_implementation.adoc[메소드 구현] 21 | 3. link:./12_interface.adoc[인터페이스] 22 | 4. link:./18_abstract_class.adoc[추상 클래스] 23 | 24 | --- 25 | 26 | link:./02_write_subclass.adoc[다음: 서브 클래스 작성] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/02_write_subclass.adoc: -------------------------------------------------------------------------------- 1 | = 서브 클래스 작성 2 | 3 | 클래스가 상속 가능하도록 디자인되었다면 그 클래스를 기반으로 파생된 클래스 즉 서브 클래스를 작성할 수 있습니다. 슈퍼 클래스는 적절한 구조를 가지도록 주의 깊게 작성되어야 합니다. 상속을 위해 설계된 슈퍼 클래스가 적절하게 설계되지 않았다면 슈퍼 클래스에서 파생된 모든 서브 클래스가 작동하지 않을 수 있습니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03_access_control_in_java[Java에서의 접근 제어] 8 | 2. link:./04_class_extension.adoc[클래스 확장] 9 | 3. link:./05_access_to_supermembers.adoc[슈퍼 클래스 멤버에 액세스] 10 | 4. link:./06_invoke_constructorofsuper.adoc[슈퍼 클래스 생성자 호출] 11 | 12 | --- 13 | 14 | link:./01_inheritance_in_java.adoc[이전: Java에서의 상속] + 15 | link:./03_access_control_in_java.adoc[다음: Java에서의 접근 제어] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/04_class_extension.adoc: -------------------------------------------------------------------------------- 1 | = 클래스 확장 2 | 3 | * 한 클래스에서 파생되는 클래스를 생성 4 | 5 | [source, java] 6 | ---- 7 | class Product { 8 | ... 9 | } 10 | 11 | class IDCard extends Product { 12 | ... 13 | } 14 | ---- 15 | 16 | image:./images/image01.png[] 17 | 18 | * 파생되는 서브 클래스는 슈퍼 클래스의 대부분의 요소를 상속함 19 | * 파생되는 서브 클래스는 슈퍼 클래스보다 낮은 가시성을 가질 수 없음 20 | 21 | --- 22 | 23 | 슈퍼 클래스에서 서브 클래스를 파생시키는 것은 슈퍼 클래스를 확장하는 것이라고도 알려져 있습니다. Java의 클래스는 하나 이상의 클래스로 확장될 수 있습니다. 24 | 25 | == 클래스 확장 구문 26 | 27 | 한 클래스에서 다른 클래스를 파생시켜 서브 클래스를 만들려면, extents 키워드를 사용합니다. 28 | 29 | [source, java] 30 | ---- 31 | class Subclass extends SuperClass { 32 | ... 33 | } 34 | ---- 35 | 36 | 서브 클래스를 선언할 때 슈퍼 클래스는 `extends` 키워드 뒤에 지정됩니다. 37 | 38 | == 서브 클래스의 상속 39 | 40 | 서브 클래스는 슈퍼 클래스의 생성자와 소멸자를 제외하고 모든 것을 슈퍼 클래스에서 상속합니다. 슈퍼 클래스의 `public` 멤버는 암시적으로 서브 클래스의 `public` 클래스의 멤버가 됩니다. 슈퍼 클래스의 `private` 멤버는 상속되지만, 슈퍼 클래스의 멤버만 액세스 할 수 있습니다. 41 | 42 | --- 43 | 44 | link:./03_access_control_in_java.adoc[이전: Java에서의 접근 제어] + 45 | link:./05_access_to_supermembers.adoc[다음: 슈퍼 클래스 멤버에 액세스] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/07_method_implementation.adoc: -------------------------------------------------------------------------------- 1 | = 메소드 구현 2 | 3 | 파생된 서브 클래스에서 슈퍼 클래스의 메소드를 재정의할 수 있습니다. 이 장에서는 상속 관계에서 메소드를 구현하는 방법을 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./08_virtual_method.adoc[가상 메소드(Virtual Method)] 8 | 2. link:./09_method_overriding.adoc[메소드 오버라이딩] 9 | 3. link:./10_final_method.adoc[final 메소드] 10 | 4. link:./11_final_class.adoc[final 클래스] 11 | 12 | --- 13 | 14 | link:./06_invoke_constructorofsuper.adoc[다음: 슈퍼 클래스 생성자 호출] + 15 | link:./08_virtual_method.adoc[다음: 가상 메소드(Virtal Method)] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/08_virtual_method.adoc: -------------------------------------------------------------------------------- 1 | = 가상 메소드 (Virtual Method) 2 | 3 | * 클래스 계층구조 내에서 같은 시그너처로 하위 클래스에서 오버라이딩 될 수 있는 메소드 4 | * 객체지향 프로그래밍의 다형성에서 아주 중요한 부분 5 | * Java의 모든 메소드는 가상 메소드로 동작 6 | 7 | --- 8 | 9 | 가상 메소드는 파생 클래스에서 다형성을 재정의할 수 있는 메소드의 구현을 지정합니다. 객체지향 프로그래밍에서, 파생된 클래스가 기본 클래스를 상속할 때, 파생된 클래스의 객체는 파생된 클래스 타입이 아닌 기본 클래스 타입의 참조 또는 포인터로 여겨집니다. 만약 기본 클래스의 메소드가 파생된 클래스의 메소드에 의해 오버라이딩 된다면, 실제로 참조나 포인터에 의해 호출되는 메소드는 컴파일 타임에 바인딩 되거나 런타임에 바인딩 될 수 있습니다. 10 | 11 | 가상 메소드는 런타임에 바인딩 됩니다. 기본 클래스의 메소드가 가상 메소드이면, 파생된 클래스의 함수 구현은 참조되는 객체의 실제 타입에 달려 있습니다. 따라서, 상속에서 기본 클래스와 파생된 클래스에 시그너처가 같은 메소드가 존재한다면 호출되는 메소드는 실제로 생성되는 인스턴스에 따라 결정됩니다. 즉, 선언된 클래스 타입이 아닌 생성된 인스턴스의 메소드를 호출합니다. 12 | 13 | --- 14 | 15 | link:./07_method_implementation.adoc[이전: 메소드 구현] + 16 | link:./08_method_overriding.adoc[다음: 메소드 오버라이딩] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/11_final_class.adoc: -------------------------------------------------------------------------------- 1 | = final 클래스 2 | 3 | * 슈퍼 클래스로 동작하도록 설계하지 않은 클래스를 파생하는 것은 위험할 수 있음 4 | * final로 선언된 클래스에서는 서브 클래스를 파생할 수 없음 5 | * Java의 String, StringBuilder등의 클래스는 final로 선언됨 6 | 7 | --- 8 | 9 | 유연한 클래스 계층 구조를 만드는 것은 쉬운 일이 아닙니다. 대부분의 클래스는 독립적으로 동작하며, 다른 클래스를 파생시키기 위해 설계되지 않습니다. 하지만 클래스는 몇 개의 키워드만으로 상속할 수 있습니다. 이런 쉬운 클래스 확장은 프로그래머가 기본 클래스로 동작하도록 설계하지 않은 클래스까지 확장할 수 있도록 해, 위험한 상황을 초래할 수 있습니다. 10 | 11 | 이런 문제를 해결하고, 파생을 방지하는 의도를 알리기 위해 Java에서는 클래스를 final로 선언할 수 있도록 합니다. final로 선언된 클래스에서는 서브 클래스를 만들 수 없습니다. 12 | 13 | [source, java] 14 | ---- 15 | public final class Product { 16 | final String getName() { 17 | return "Product"; 18 | } 19 | } 20 | 21 | class IDCard extends Product { // 컴파일시 오류 22 | 23 | } 24 | ---- 25 | 26 | link:./10_final_method.adoc[이전: final 메소드] + 27 | link:./12_interface.adoc[다음: 인터페이스] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/12_interface.adoc: -------------------------------------------------------------------------------- 1 | = 인터페이스 2 | 3 | 인터페이스는 파생되는 모든 클래스가 준수해야하는 구문 및 의미 계약을 지정합니다. 특히 인터페이스는 계약의 어떤 부분을 설명하고 인터페이스를 구현하는 클래스는 계약의 일부를 설명합니다. 이 장에서는 인터페이스에 대해 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./13_define_interface.adoc[인터페이스 선언] 8 | 2. link:./14_multiple_interface_implemenatation.adoc[다중 인터페이스 구현] 9 | 3. link:./15_implement_interface_method.adoc[인터페이스 메소드 구현] 10 | 4. link:./16_methods_in_interface.adoc[인터페이스의 default 메소드] 11 | 5. link:./17_static_method_in_interface.adoc[인터페이스에서 static 메소드 구현] 12 | 13 | --- 14 | 15 | link:./11_final_class.adoc[이전: final 클래스] + 16 | link:./13_define_interface.adoc[다음: 인터페이스 선언] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/13_define_interface.adoc: -------------------------------------------------------------------------------- 1 | = 인터페이스 선언 2 | 3 | * interface 키워드를 사용하여 선언 4 | 5 | [source, java] 6 | ---- 7 | interface BinaryOp { 8 | void apply(int right, int left); 9 | } 10 | 11 | class Adder implements BinaryOp { 12 | public int apply(int right, int left) { 13 | ... 14 | } 15 | } 16 | ---- 17 | 18 | --- 19 | 20 | 인터페이스는 코드가 없는 클래스와 비슷합니다. 클래스를 선언하는 방법과 같은 방식으로 인터페이스를 선언합니다. class 키워드 대신 interface 키워드를 사용하는 것만 다릅니다. 21 | 22 | == 인터페이스 기능 23 | 24 | 인터페이스의 메소드는 기본적으로 구현을 가질 수 없습니다. 인터페이스의 메소드는 본문이 없는 시그너처만 가진 메소드여야 합니다. 25 | 26 | [source, java] 27 | ---- 28 | interface BinaryOp { 29 | int apply() { ... } // 컴파일시 오류 30 | } 31 | ---- 32 | 33 | Java 8에서 `Interface` 에 `default` 를 사용하여 모든 타입의 기본 구현을 정의할 수 있는 방법이 추가되었고, `static` 메서드 또한 추가되었습니다. 그러나 구현을 가질 수 없는 인터페이스의 메소드는 객체지향 다형성 구현을 위해 가장 중요한 기능입니다. 34 | 35 | link:./12_interface.adoc[이전: 인터페이스] + 36 | link:./14_multiple_interface_implemenatation.adoc[다음: 인터페이스의 default와 static 메소드] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/17_static_method_in_interface.adoc: -------------------------------------------------------------------------------- 1 | = 인터페이스에서 static 메소드 구현 2 | 3 | * 인터페이스에서 static 메소드를 구현 후 사용 4 | * 호출시 메소드의 전체 이름을 사용 5 | 6 | --- 7 | 8 | Java 8 부터 인터페이스에서 `default` 메소드뿐 아니라 `static` 메소드를 작성할 수 있는 기능이 추가되었습니다. 인터페이스에 `static` 메소드를 선언하는 것은 클래스에 `static` 메소드를 정의하는 것과 동일합니다. 9 | 10 | [source, java] 11 | ---- 12 | interface Sort { 13 | static void SortIntArray(int[] array) { 14 | ... 15 | } 16 | } 17 | ---- 18 | 19 | 인터페이스의 `static` 메소드는 객체 생성없이 한 공간에서 연관된 결합도를 상승시키는 간단한 방법을 제공합니다. 인터페이스의 `static` 메소드는 클래스의 생성없이 연관된 메소드들을 그룹화 할 수 있습니다. 20 | 21 | link:./16_methods_in_interface.adoc[이전: 인터페이스의 default 메소드] + 22 | link:./18_abstract_class.adoc[다음: 추상 클래스] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/18_abstract_class.adoc: -------------------------------------------------------------------------------- 1 | = 추상클래스 2 | 3 | 추상 클래스는 파생된 클래스에서 완료할 수 있는 부분적인 구현을 제공하는데 사용됩니다. 추상 클래스는 여러 서브 클래스에서 재사용할 수 있는 코드를 상속하여 재사용을 제공한다는 데에서 유용합니다. 이 장에서는 추상 클래스를 생성하고 사용하는 것을 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./contents/19_declare_abstract_class.adoc[추상 클래스 선언] 8 | 2. link:./contents/20_abstract_in_hire.adoc[클래스 계층 구조에서 추상 클래스 사용] 9 | 3. link:./contents/21_abstract_in_hire2.adoc[클래스 계층 구조에서 추상 클래스 사용 (2)] 10 | 4. link:./contents/22_abstract_interface.adoc[추상 클래스와 인터페이스] 11 | 5. link:./contents/23_implements_abstract.adoc[추상 메소드 구현] 12 | 13 | --- 14 | 15 | link:./17_static_method_in_interface.adoc[이전: 인터페이스에서 static 메소드 구현] + 16 | link:./19_declare_abstract_class.adoc[다음: 추상 클래스 선언] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/19_declare_abstract_class.adoc: -------------------------------------------------------------------------------- 1 | = 추상 클래스 선언 2 | 3 | * 클래스 인스턴스를 생성할 수 없음 4 | * 선언이 아닌 구현(코드)을 상속하는 형태로 사용 5 | * abstract 키워드를 사용해서 선언 6 | 7 | [source, java] 8 | ---- 9 | abstract class Factory { 10 | ... 11 | } 12 | 13 | class Test { 14 | public static void main(String[] args) { 15 | Factory factory = new Factory(); // 컴파일시 오류 16 | } 17 | } 18 | ---- 19 | 20 | --- 21 | 22 | abstract 키워드를 사용하여 추상 클래스를 선언할 수 있습니다. 23 | 24 | 추상 클래스는 일반 클래스를 생성하고 사용하는 것과 거의 동일합니다. 추상 클래스와 일반 클래스의 차이점은 아래와 같습니다. 25 | 26 | * 추상 클래스는 인스턴스를 생성할 수 없습니다. + 27 | 이 관점에서 인터페이스와 동일합니다. 28 | * 추상 클래스에는 추상 메소드를 선언할 수 있습니다. + 29 | 추상 클래스에는 메소드 본문이 없는 추상 메소드를 선언할 수 있습니다. 일반 클래스에서는 본문이 없는 메소드를 선언할 수 없습니다. 30 | 31 | 추상 클래스와 일반 클래스의 공통점은 아래와 같습니다. 32 | 33 | * 제한된 확장성 + 34 | 추상 클래스 역시 인터페이스가 아니라 클래스이므로, 단일 클래스에서만 파생됩니다. 추상 클래스는 추상 클래스가 아닌 일반 클래스를 확장할 수 없습니다. 35 | * 인터페이스 다중 상속 + 36 | 추상 클래스는 하나 이상의 인터페이스를 구현할 수 있습니다. 37 | * 인터페이스 메소드 구현 + 38 | 추상 클래스는 상속한 인터페이스의 메소드를 반드시 구현해야 합니다. 39 | 40 | --- 41 | 42 | link:./18_abstract_class.adoc[이전: 추상 클래스] + 43 | link:./20_abstract_in_hier.adoc[다음: 클래스 계층 구조에서 추상 클래스 사용] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/22_abstract_interface.adoc: -------------------------------------------------------------------------------- 1 | = 추상 클래스와 인터페이스 2 | 3 | * 유사점 4 | ** 인스턴스화 될 수 없음 5 | ** 파생 방지(final)로 선언될 수 없음 6 | * 차이점 7 | ** 인터페이스는 같은 타입으로서의 구현을 강제 8 | ** 추상 클래스는 데이터와 구현(코드)를 상속하고 확장을 유도 9 | ** 인터페이스는 인터페이스 외에는 확장할 수 없음 10 | 11 | --- 12 | 13 | 추상 클래스와 인터페이스는 모두 파생하기 위해 존재합니다. 추상 클래스는 클래스이므로 클래스는 추상 클래스 하나만을 확장할 수 있습니다. 따라서 인터페이스에서 파생될 때 보다 추상 클래스에서 파생되는 경우를 더 주의 깊게 고려해야 합니다. “is a” 관계가 꼭 필요한 경우 추상 클래스를 사용하는 것이 좋습니다. 14 | 15 | 추상 클래스와 인터페이스의 유사한 점은 다음과 같습니다. 16 | 17 | * 인스턴스화 될 수 없습니다. + 18 | 객체로 생성되어 사용할 수 없다는 것을 의미합니다. 19 | * 파생방지로 선언될 수 없습니다. + 20 | 인터페이스와 추상 클래스의 용도는 파생되는 클래스를 만들어 내기 위한 용도로 쓰입니다. 21 | 22 | 추상 클래스와 인터페이스의 차이점은 다음과 같습니다. 23 | 24 | * 구현 관점 25 | ** 인터페이스는 구현을 포함할 수 없습니다. (default와 static은 예외) 26 | ** 추상 클래스는 구현과 데이터를 포함할 수 있습니다. 27 | * 접근 관점 28 | ** 인터페이스는 메소드는 public으로 선언됩니다. 29 | ** 추상 클래스의 메소드는 모든 접근 제한을 사용할 수 있습니다. 30 | * 확장 관점 31 | ** 인터페이스는 인터페이스만 확장할 수 있습니다. 32 | ** 추상 클래스는 추상 클래스가 아닌 일반 클래스도 확장할 수 있습니다. 33 | 34 | --- 35 | 36 | link:./21_abstract_in_hier2.adoc[이전: 클래스 계층 구조에서 추상 클래스 사용 (2)] + 37 | link:./23_implements_abstract.adoc[다음: 추상 메소드 구현] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/26_lab_10-3.adoc: -------------------------------------------------------------------------------- 1 | = Lab 10-3 ArrayList와 LinkedList의 Iterator 구현 2 | 3 | link:./24_lab_10-2.adoc[이전: Lab 10-2: ArrayList와 LinkedList 구현] + 4 | link:./26_review.adoc[다음: 검토] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/27_review.adoc: -------------------------------------------------------------------------------- 1 | = 검토 2 | 3 | * 파생 클래스 작성 4 | * 메소드 구현 5 | * final 클래스 6 | * 인터페이스 7 | * 추상 클래스 8 | 9 | --- 10 | 11 | Quiz 12 | 13 | 1. Widget 클래스를 만들고 void를 return하고 파라미터가 없는 두 개의 public 메소드를 선언합니다. 첫 번째 메소드의 이름은 first로 지정합니다. 두 번째 메소드의 이름은 second로 지정하고 오버라이드 되지 못하도록 선언합니다. 14 | 2. 두 메소드를 선언하는 IWidget 인터페이스를 만듭니다. void를 반환하고 파라미터를 가지지 않으며, 각각의 이름은 first와 second입니다. second 메소드는 오버라이드 되지 못하도록 선언합니다. 15 | 3. Widget이라는 추상 클래스를 만들고 void를 반환하며 파라미터를 가지지 않은 추상 메소드 first를 재정의 하여 확장하는 FancyWidget 클래스를 만듭니다. 16 | 4. 3에서 만든 FancyWidget 클래스를 파생 방지 클래스로 선언합니다. 17 | 18 | link:./23_lab_10-1.adoc[이전: Lab 10-1 상속을 사용하여 인터페이스 구현] -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module10_inheritance_in_java/contents/images/image01.png -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module10_inheritance_in_java/contents/images/image02.png -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module10_inheritance_in_java/contents/images/image03.png -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/contents/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module10_inheritance_in_java/contents/images/image04.png -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/homework/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module10_inheritance_in_java/homework/images/image01.png -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/homework/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module10_inheritance_in_java/homework/images/image02.png -------------------------------------------------------------------------------- /course/Module10_inheritance_in_java/homework/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module10_inheritance_in_java/homework/images/image03.png -------------------------------------------------------------------------------- /course/Module11_generics/LabFile/Lab11-1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module11_generics/LabFile/Lab11-1.zip -------------------------------------------------------------------------------- /course/Module11_generics/LabFile/Lab11-2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module11_generics/LabFile/Lab11-2.zip -------------------------------------------------------------------------------- /course/Module11_generics/LabFile/Lab11-A.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module11_generics/LabFile/Lab11-A.zip -------------------------------------------------------------------------------- /course/Module11_generics/SampleCode/ArrayList.java: -------------------------------------------------------------------------------- 1 | import java.util.Iterator; 2 | 3 | public class ArrayList implements Iterable { 4 | private int[] elements; 5 | private int index = 0; 6 | 7 | public ArrayList() { 8 | this.elements = new int[10]; 9 | } 10 | 11 | public void add(int item) { 12 | try { 13 | this.elements[this.index++] = item; 14 | } 15 | catch(ArrayIndexOutOfBoundsException e) { 16 | System.out.println("List full!"); 17 | } 18 | } 19 | 20 | public void remove(int index) { 21 | for (int i = index; i < this.index - 1; i++) { 22 | this.elements[i] = this.elements[i + 1]; 23 | this.elements[i + 1] = 0; 24 | } 25 | this.index--; 26 | } 27 | 28 | public int get(int index) { 29 | return this.elements[index--]; 30 | } 31 | 32 | public int size() { 33 | return this.index; 34 | } 35 | 36 | public Iterator iterator() { 37 | return new ArrayListEnumerator(this); 38 | } 39 | } -------------------------------------------------------------------------------- /course/Module11_generics/SampleCode/ArrayListEnumerator.java: -------------------------------------------------------------------------------- 1 | import java.util.Iterator; 2 | 3 | public class ArrayListEnumerator implements Iterator { 4 | ArrayList list; 5 | int index = 0; 6 | 7 | public ArrayListEnumerator(ArrayList list) { 8 | this.list = list; 9 | } 10 | 11 | public boolean hasNext() { 12 | if (list.size() < this.index) { 13 | return false; 14 | } 15 | else { 16 | return true; 17 | } 18 | } 19 | 20 | public Integer next() { 21 | return list.get(this.index++); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /course/Module11_generics/contents/02_overview_generics.adoc: -------------------------------------------------------------------------------- 1 | = Generics 개요 2 | 3 | Generics는 Generic이라는 단어가 주는 의미처럼, 다양한 타입에 적용할 수 있는 객체를 만들수 있도록 지원합니다. 이 장에서는 Java 언어의 Generics 개요에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03_generics_overview.adoc[Generics 개요] 8 | 2. link:./04_background.adoc[Generics 도입 배경] 9 | 3. link:./05_pros_and_cons.adoc[Generics의 장점과 단점] 10 | 4. link:./06_generics_collections.adoc[Java Collections Framework와 Generics] 11 | 12 | --- 13 | 14 | link:./01_generics[이전: Generics] + 15 | link:./03_generics_overview.adoc[다음: Generics 개요] -------------------------------------------------------------------------------- /course/Module11_generics/contents/07_basic.adoc: -------------------------------------------------------------------------------- 1 | = Generics 기본 2 | 3 | Java Generics는 컴파일 시점에 타입을 지정할 수 있는 기능으로, 타입 안정성과 코드 재사용성을 제공하기 위해 도입되었습니다. Generics는 주로 클래스, 메서드, 인터페이스에서 사용되며, 데이터를 저장하거나 처리할 때 타입 안정성을 확보합니다. 4 | 5 | 이 단원에서는 Generics의 기본적인 내용에 대해 학습합니다. 6 | 7 | == Table of Contents 8 | 9 | 1. link:./08_syntax.adoc[Generics 문법 이해] 10 | 2. link:./09_type_parameter.adoc[타입 파라미터 선언 및 사용법] 11 | 3. link:./10_multiple_type.adoc[다중 타입 파라미터] 12 | 4. link:./11_generic_class.adoc[Generic 클래스 정의] 13 | 5. link:./12_generic_method.adoc[Generic 메소드 정의] 14 | 6. link:./13_bordered_type.adoc[제한된 타입 파라미터] 15 | 7. link:./14_extends_keyword.adoc[extends 키워드] 16 | 8. link:./15_multiple_bounds.adoc[다중 제한 (Multiple Bounds)] 17 | 9. link:./16_lab11-1.adoc[Lab 11-1: 기본적인 Generics 사용] 18 | 19 | --- 20 | 21 | link:./06_generics_collections.adoc[이전: Java Collections Framework와 Generics] + 22 | link:./08_syntax.adoc[다음: Generics 문법] -------------------------------------------------------------------------------- /course/Module11_generics/contents/17_type_safety.adoc: -------------------------------------------------------------------------------- 1 | = Generics와 타입 안정성 2 | 3 | 타입 안정성은 잘못된 타입의 데이터를 처리하지 않도록 보장하는 것입니다. Generics는 컴파일 시점에 타입 검사를 수행하므로, 런타임 에러 대신 컴파일 타임에 에러를 발견할 수 있습니다. 4 | 5 | Java에서, Generics를 사용하면 런타임에 발생할 수 있는 오류를 컴파일 타임에 발견할 수 있도록 하여 오류가 없는 프로그램을 작성하는데 도움을 줍니다. 이번 단원에서는 Generics의 장점인 타입 안정성에 대해 알아봅니다. 6 | 7 | == Table of Contents 8 | 9 | 1. link:./18_type_check_compiletime.adoc[컴파일 타임 타입 체크] 10 | 2. link:./19_avoiding_typecastring.adoc[타입 캐스팅 제거] 11 | 3. link:./20_raw_type.adoc[Raw Type(비제네릭 타입)의 이해] 12 | 4. link:./21_code_quality_improvement[타입 안정성과 코드 품질 향상] 13 | 14 | --- 15 | 16 | link:./16_lab11-1.adoc[이전: Lab 11-1 기본적인 Generics 사용] + 17 | link:./18_type_check_compiletime.adoc[다음: 컴파일 타임 타입 체크] -------------------------------------------------------------------------------- /course/Module11_generics/contents/20_raw_type.adoc: -------------------------------------------------------------------------------- 1 | = Raw Type(비제네릭 타입)의 이해 2 | 3 | * Java의 Generics가 도입되기 이전의 방식 4 | * 제네릭 타입의 매개변수를 사용하지 않고 선언한 컬렉션이나 클래스를 의미 5 | ** 타입 안정성 부족 6 | ** 가독성과 유지 보수성 저하 7 | ** 컴파일러가 경고 발생 8 | * Java의 이전 버전(Generics가 도입되기 전인 Java 5)과의 하위 호환성을 유지하기 위해 지원됨 9 | 10 | --- 11 | 12 | Raw 타입은 Java의 Generics가 도입되기 이전의 방식으로, 제네릭 타입의 매개변수를 사용하지 않고 선언한 컬렉션이나 클래스를 의미합니다. 즉, 제네릭 타입을 명시하지 않고 사용하는 경우를 말합니다. Raw 타입은 Java의 이전 버전(Generics가 도입되기 전인 Java 5)과의 하위 호환성을 유지하기 위해 지원됩니다. 13 | 14 | == RAW 타입의 특징 15 | 16 | Raw 타입은 Generic 클래스테서 타입 파라미터를 지정하지 않은 상태로 사용됩니다. 17 | 18 | [source, java] 19 | ---- 20 | List list = new ArrayList(); // Raw 타입 21 | ---- 22 | 23 | Raw 타입을 사용할 경우, 컴파일러는 Unchecked Operation 경고를 발생시킵니다. 24 | 25 | [source, java] 26 | ---- 27 | List list = new ArrayList(); // 경고 발생 28 | list.add("Hello"); 29 | list.add(123); 30 | ---- 31 | 32 | Raw 타입에서는 컴파일러가 타입을 체크하지 않으므로, 잘못된 타입이 삽입되더라도 컴파일 시에는 오류가 발생하지 않습니다. 이는 런타임 시 ClassCastException의 위험을 증가시킵니다. 33 | 34 | --- 35 | 36 | link:./19_avoiding_typecastring.adoc[이전: Generics에서 타입 캐스팅 제거] + 37 | link:./21_code_quality_improvement.adoc[다음: Generics와 코드 품질 향상] -------------------------------------------------------------------------------- /course/Module11_generics/contents/22_lab11-2.adoc: -------------------------------------------------------------------------------- 1 | = Lab 11-2 Generic Stack 작성 2 | 3 | 이 연습에서는 int 데이터 타입만 추가하고 꺼낼 수 있는 Stack을 수정하여 모든 참조 타입 데이터를 처리할 수 있는 Generic Stack으로 수정합니다. 4 | 5 | --- 6 | 7 | link:./21_code_quality_improvement.adoc[이전: Generics와 코드 품질 향상] + 8 | link:./23_advanced_topic.adoc[다음: Generics 고급 주제] -------------------------------------------------------------------------------- /course/Module11_generics/contents/23_advanced_topic.adoc: -------------------------------------------------------------------------------- 1 | = Generics 고급 주제 2 | 3 | Generics는 Java에서 타입 안정성과 코드 재사용성을 높이기 위한 강력한 도구입니다. 기본적인 사용법 외에도, Generics에는 타입 매개변수의 제약, 와일드카드, 제네릭 메서드와 클래스, 타입 소거 등 다양한 고급 주제가 포함됩니다. 이 단원에서는 Generics 고급 주제에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./24_wild_card.adoc[와일드카드(?)] 8 | 2. link:./25_covariance.adoc[? extends T와 공변성(Covariance)] 9 | 3. link:./26_contravariance.adoc[? super T와 반공변성(Contravariance)] 10 | 4. link:./27_unlimited_wildcard.adoc[무제한 와일드카드(?)] 11 | 5. link:./28_type_erasure.adoc[Generics와 타입 소거(Type Erasure)] 12 | 6. link:./29_generics_compile.adoc[컴파일러가 Generics를 처리하는 방식] 13 | 7. link:./30_inhertance_generics.adic[상속과 Generics] 14 | 8. link:./31_generic_class_inheritance.adoc.adoc[제네릭 클래스 상속] 15 | 9. link:./32_generic_method_overriding.adoc[Generic 메소드 오버라이딩] 16 | 17 | --- 18 | 19 | link:./22_lab11-2.adoc[이전: Lab 11-2 Generic Stack 작성] + 20 | link:./24_wild_card.adoc[다음: 와일드 카드] -------------------------------------------------------------------------------- /course/Module11_generics/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module11_generics/images/image01.png -------------------------------------------------------------------------------- /course/Module12_lambda_expression/SampleCode/BinaryOp.java: -------------------------------------------------------------------------------- 1 | @FunctionalInterface 2 | public interface BinaryOp { 3 | int apply(int i, int j); 4 | } 5 | 6 | class Algorithm { 7 | static BinaryOp Adder = (i, j) -> i * j; 8 | 9 | static BinaryOp multiplier = new BinaryOp() { 10 | public int apply(int i, int j) { 11 | return i * j; 12 | } 13 | }; 14 | 15 | public static int calc(BinaryOp binder, int start, int end, int step, int init) { 16 | int result = init; 17 | for (int i = start; i <= end; i += step) { 18 | result = binder.apply(result, i); 19 | } 20 | return result; 21 | } 22 | 23 | public static int sigma(int start, int end, int step) { 24 | return calc(Adder, start, end, step, 0); 25 | } 26 | 27 | public static int pi(int start, int end, int step) { 28 | return calc(multiplier, start, end, step, 1); 29 | } 30 | } 31 | 32 | class Test { 33 | public static void main(String[] args) { 34 | System.out.println(Algorithm.sigma(1, 10, 1)); 35 | System.out.println(Algorithm.pi(1, 10, 1)); 36 | } 37 | } -------------------------------------------------------------------------------- /course/Module12_lambda_expression/SampleCode/Department.java: -------------------------------------------------------------------------------- 1 | import java.util.List; 2 | import java.util.ArrayList; 3 | import java.util.Collections; 4 | import java.util.Iterator; 5 | import java.util.Comparator; 6 | 7 | public class Department> implements Iterable { 8 | private List list; 9 | 10 | public Department() { 11 | this.list = new ArrayList<>(); 12 | } 13 | 14 | public void add(E element) { 15 | this.list.add(element); 16 | } 17 | 18 | public void sort() { 19 | Collections.sort(this.list); 20 | } 21 | 22 | public void sort(Comparator comparator) { 23 | Collections.sort(this.list, comparator); 24 | } 25 | 26 | @Override 27 | public Iterator iterator() { 28 | return this.list.iterator(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /course/Module12_lambda_expression/SampleCode/MethodReference.java: -------------------------------------------------------------------------------- 1 | interface BinaryOp { 2 | public int apply(int i, int j); 3 | } 4 | 5 | class Calc { 6 | public static int add(int i, int j) { 7 | return i + j; 8 | } 9 | 10 | public int mult(int i, int j) { 11 | return i * j; 12 | } 13 | } 14 | 15 | class Test { 16 | public static void main(String[] args) { 17 | BinaryOp adder = Calc::add; 18 | BinaryOp multer = new Calc()::mult; 19 | System.out.println(adder.apply(1, 2)); 20 | System.out.println(multer.apply(2, 3)); 21 | } 22 | } -------------------------------------------------------------------------------- /course/Module12_lambda_expression/SampleCode/UnaryOp.java: -------------------------------------------------------------------------------- 1 | @FunctionalInterface 2 | interface UnaryOp { 3 | public int apply(int a); 4 | } 5 | 6 | class Test { 7 | public static int getUnaryResult(UnaryOp binder, int input) { 8 | return binder.apply(input); 9 | } 10 | 11 | public static void main(String[] args) { 12 | // 익명 클래스 13 | UnaryOp unaryResult = new UnaryOp() { 14 | public int apply(int i) { 15 | return i + i; 16 | } 17 | }; 18 | 19 | // 익명 클래스 형식 사용 20 | getUnaryResult(unaryResult, 1); 21 | 22 | // 람다 식 사용 23 | UnaryOp getUnaryResult = (int a) -> {return a + a;}; 24 | 25 | getUnaryResult(getUnaryResult, 1); 26 | 27 | // 람다 식 직접 사용 28 | getUnaryResult((int a) -> {return a + a;}, 1); 29 | 30 | // 파라미터 타입 생략 31 | getUnaryResult((a) -> {return a + a;}, 1); 32 | 33 | // 파라미터가 하나인 경우 괄호 생략 34 | getUnaryResult(a -> {return a + a;}, 1); 35 | 36 | // 괄호가 생략된 수행문에 return 키워드가 없을 경우 return 생략 37 | getUnaryResult(a -> a + a, 1); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /course/Module12_lambda_expression/contents/02_overview_lambda.adoc: -------------------------------------------------------------------------------- 1 | = Lambda Expression 개요 2 | 3 | Anonymous Method 형식으로 동작하는 Lambda Expression은 파라미터를 받아 짧은 코드 블록으로 수행하고 필요에 따라 값을 반환하는 표현 방법을 말합니다. 이 장에서는 Lambda Expression에 대해 공부합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. Lambad Expression 개요 8 | 2. Java의 함수형 프로그래밍 개념 9 | 3. Lambda Expression의 필요성 10 | 4. 함수형 프로그래밍 11 | 5. Lambda Expression의 장점 12 | 13 | --- 14 | 15 | link:./01_Lambda.adoc[이전: Lambda Expression] + 16 | link:./03_overview.adoc[다음: Lambda Expression 개요] -------------------------------------------------------------------------------- /course/Module12_lambda_expression/contents/08_basic.adoc: -------------------------------------------------------------------------------- 1 | = Lambda Expression 기본 2 | 3 | 람다 표현식은 코드 간결성, 가독성, 병렬 처리 효율성 등 많은 이점을 제공하며, 자바에서 함수형 프로그래밍을 지원하는 강력한 도구입니다. 이 단원에서는 Lambda Expression을 사용하는 기본적인 방법에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. Java Lambda Expression 기본 문법 8 | 2. Java Lambda Expression의 기본 구조 9 | 3. Functional Interface 10 | 11 | --- 12 | 13 | link:./07_benefit.adoc[이전: Java에서 Lambda Expression의 장점] + 14 | link:./09_syntax.adoc[다음: Java Lambda Expression 기본 문법] -------------------------------------------------------------------------------- /course/Module12_lambda_expression/contents/12_fi_in_library.adoc: -------------------------------------------------------------------------------- 1 | = Java 내장 Functional Interface 2 | 3 | 자바 8에서는 함수형 프로그래밍을 지원하기 위해 다양한 내장 Functional Interface를 제공하고 있습니다. 이들은 모두 java.util.function 패키지에 포함되어 있으며, 주로 Lambda Expression과 함께 사용됩니다. 이 단원에서는 Java 라이브러리에서 제공되는 4 | 5 | == Table of Contents 6 | 7 | 1. java.util.function 패키지 개요 8 | 2. 주요 Functional Interface 9 | 10 | --- 11 | 12 | link:./11_functional_interface.adoc[이전: Functional Interface] + 13 | link:./13_java_util_function.adoc[다음: java.util.function 패키지 개요] -------------------------------------------------------------------------------- /course/Module12_lambda_expression/contents/13_java_util_function.adoc: -------------------------------------------------------------------------------- 1 | = java.util.function 패키지 개요 2 | 3 | * java 8에서 도입된 함수형 프로그래밍 지원 패키지 4 | * Lambda Expression 및 메서드 참조와 함께 사용 가능 5 | * 조건 테스트, 데이터 변환, 값 소비/공급 등의 작업을 처리하는 다양한 함수형 인터페이스를 포함 6 | * 함수형 프로그래밍 스타일을 지원하여 간결하고 가독성 높은 코드 작성 가능 7 | * 주로 Lambda Expression 및 Stream API와 함께 사용 8 | * 표준화된 방식으로 다양한 작업 처리 가능 9 | 10 | --- 11 | 12 | `java.util.function` 패키지는 자바 8에서 도입된 람다 표현식과 함수형 프로그래밍을 지원하기 위한 내장 함수형 인터페이스들을 제공합니다. 이 패키지의 인터페이스들은 다양한 작업(조건 테스트, 변환, 소비, 공급 등)을 처리하는 표준화된 방식을 제공합니다. 13 | 14 | java.util.function 패키지의 주요 특징은 다음과 같습니다. 15 | 16 | * 함수형 프로그래밍을 지원하여 간결하고 효율적인 코드를 작성할 수 있도록 합니다. 17 | * 이진 연산, 단항 연산, 소비, 공급, 변환 등의 연산을 위한 다양한 범용 Functional interfce들을 포함합니다. 18 | * Lambda Expression 및 메소드 참조와 함께 사용할 수 있습니다. 19 | * 형 변환 등의 작업에서 일어날 수 있는 성능 감소를 회피하기 위해 기본 데이터 타입 전용 Functional interface를 제공합니다. 20 | 21 | java.util.function 패키지는 다양한 함수형 인터페이스를 제공하여 Lambda Expression 및 메서드 참조를 활용한 함수형 프로그래밍을 구현할 수 있도록 돕습니다. 22 | 23 | 코드의 가독성, 재사용성, 간결성을 크게 향상시키며, 특히 데이터 처리 스트림(Stream)과 함께 널리 사용됩니다. 24 | 25 | --- 26 | 27 | link:./12_fi_in_library.adoc[이전: Java 내장 Functional Interface] + 28 | link:./14_built_in_fi.adoc[다음: 주요 Functional Interface] -------------------------------------------------------------------------------- /course/Module12_lambda_expression/contents/17_usage.adoc: -------------------------------------------------------------------------------- 1 | = Lambda Expression의 활용 2 | 3 | Lambda Expression(람다 표현식)은 자바에서 간결하고 효율적인 코드 작성을 가능하게 하며, 다양한 영역에서 유용하게 사용됩니다. 이 단원에서는 Lambda Expression의 주요 활용 사례에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. 컬렉션과 스트림 API에서 Lambda 사용 8 | 2. 메서드 참조와 생성자 참조 9 | 3. Custom Functional Interface 구현 10 | 11 | --- 12 | 13 | link:./16_other_functional.adoc[이전: 기타 중요한 Functional Interface] + 14 | link:./18_collection_stream.adoc[다음: Collection과 Stream API에서 Lambda 사용] -------------------------------------------------------------------------------- /course/Module12_lambda_expression/contents/21_advanced_topic.adoc: -------------------------------------------------------------------------------- 1 | = Advanced Topics 2 | 3 | Java Lambda Expression의 고급 주제는 더욱 강력한 함수형 프로그래밍을 가능하게 하며, 효율적이고 직관적인 코드를 작성할 수 있는 도구를 제공합니다. 이 단원에서는 Lambda Expression의 고급 주제에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. 고차 함수 8 | 2. Closer 9 | 3. Currying 10 | 4. 재귀 람다식 11 | 5. 메소드 참조와 결합 12 | 6. 성능 최적화 13 | 7. Composition 14 | 8. 예외 처리 -------------------------------------------------------------------------------- /course/Module12_lambda_expression/contents/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module12_lambda_expression/contents/images/image01.png -------------------------------------------------------------------------------- /course/Module12_lambda_expression/contents/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module12_lambda_expression/contents/images/image02.png -------------------------------------------------------------------------------- /course/Module12_lambda_expression/contents/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module12_lambda_expression/contents/images/image03.png -------------------------------------------------------------------------------- /course/Module12_lambda_expression/contents/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module12_lambda_expression/contents/images/image04.png -------------------------------------------------------------------------------- /course/Module12_lambda_expression/contents/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module12_lambda_expression/contents/images/image05.png -------------------------------------------------------------------------------- /course/Module12_lambda_expression/contents/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module12_lambda_expression/contents/images/image06.png -------------------------------------------------------------------------------- /course/Module12_lambda_expression/readme.adoc: -------------------------------------------------------------------------------- 1 | = Module 12 Lambda Expression 2 | 3 | link:./contents/01_Lambda.adoc[Module 12: Lambda Expression] 4 | 5 | * link:./contents/02_overview_lambda.adoc[Chapter 1: Lambda Expression 개요] 6 | ** link:./contents/03_overview.adoc[Lambda Expression 개요] 7 | ** link:./contents/04_lambda_java.adoc[Java의 함수형 프로그래밍 개념] 8 | ** link:./contents/05_why_lambda.adoc[Lambda Expression의 필요성] 9 | ** link:./contents/06_functional_programming.adoc[함수형 프로그래밍] 10 | ** link:./contents/07_benefits.adoc[Java에서 Lambda Expression의 장점] 11 | * link:./contents/08_basic.adoc[Chapter 2: Lambda Expression 기본] 12 | ** link:./contents/09_syntax.adoc[Java Lambda Expression 기본 문법] 13 | ** link:./contents/10_basic_structure.adoc[Java Lambda Expression의 기본 구조] 14 | ** link:./contents/11_functional_interface.adoc[Functional Interface] 15 | -------------------------------------------------------------------------------- /course/Module13_annotation/LabFile/Lab13-1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module13_annotation/LabFile/Lab13-1.zip -------------------------------------------------------------------------------- /course/Module13_annotation/LabFile/Lab13-2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module13_annotation/LabFile/Lab13-2.zip -------------------------------------------------------------------------------- /course/Module13_annotation/contents/02_chapter1_annotation.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 1: Annotation 개요 2 | 3 | Annotation은 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시켜 프로그램에 유용한 기능을 포함시키고 정보를 제공할 수 있는 기능입니다. 이 단원에서는 Annotation에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03_whatis_annotation.adoc[Annotation 개요] 8 | 2. link:./04_why_annotation.adoc[Annotation의 필요성과 활용목적] 9 | 3. link:./05_aop_annotation.adoc[AOP와 Annotation] 10 | 4. link:./06_declare.adoc[Annotation 선언] 11 | 12 | --- 13 | 14 | link:./01_annotation.adoc[이전: Module 13 Annotation] + 15 | link:./03_whatis_annotation.adoc[다음: Annotation 개요] 16 | -------------------------------------------------------------------------------- /course/Module13_annotation/contents/07_chapter2_target.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 2: Annotation Target 2 | 3 | Annotation은 기본적으로 선언에 적용될 수 있습니다. 클래스, 필드, 메소드 및 기타 프로그램 요소의 선언에 적용될 수 있으며, Java 8부터 일부 Annotation이 구현부에서 타입과 함께 사용될 수 있습니다. 이 단원에서는 Annotation의 Target에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./08_decl.adoc[선언부 Annotation] 8 | 2. link:./09_impl.adoc[구현부 Annotation] 9 | 10 | --- 11 | 12 | link:./06_declare.adoc[이전: Annotation 선언] + 13 | link:./08_decl.adoc[다음: 선언부 Annotation] -------------------------------------------------------------------------------- /course/Module13_annotation/contents/09_impl.adoc: -------------------------------------------------------------------------------- 1 | = 구현부 Annotation 2 | 3 | * 생성자 4 | * 타입 변환 5 | * instanceof 6 | * 배열 7 | 8 | --- 9 | 10 | == 생성자 11 | 12 | 인스턴스 생성자에 선언하여 객체 초기화를 어드바이스 할 수 있습니다. 13 | 14 | [source, java] 15 | ---- 16 | MyObject myObject= new @Interned MyObject(); 17 | ---- 18 | 19 | == 타입 변환 20 | 21 | 타입 변환되는 변수 앞에 선언되어 타입 변환을 어드바이스 할 수 있습니다. 외부 도구를 위해 제공되며, 타입 변환 동작에는 영향을 주지 않습니다. 22 | 23 | [source, java] 24 | ---- 25 | myString = (@NonNull String)str; 26 | ---- 27 | 28 | == instanceof 29 | 30 | instanceof 연산자에 제공되어 어드바이스 할 수 있으며, 외부 도구를 위해 제공되어 연산자에는 영향을 주지 않습니다. 31 | 32 | [source, java] 33 | ---- 34 | if (text instanceof @Localized String) {...} 35 | ---- 36 | 37 | == 배열 38 | 39 | 배열의 다양한 위치에서 제공되어 배열 생성과 사용을 어드바이스 할 수 있습니다. 40 | 41 | [source, java] 42 | ---- 43 | @NonNull String[][] words; // words[i][j]는 null이 아님 44 | String @NonNull [][] words; // words는 null이 아님 45 | String[] @NonNull [] words; // words[i]는 null이 아님 46 | ---- 47 | 48 | --- 49 | 50 | link:./08_decl.adoc[이전: 선언부 Annotation] + 51 | link:./10_chapter3_standard.adoc[다음: 표준 Annotation] -------------------------------------------------------------------------------- /course/Module13_annotation/contents/10_chapter3_standard.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 3: 표준 Annotation 2 | Java에서는 용도에 따라 사용할 수 있는 기본 Annotation들을 제공합니다. 이 단원에서는 주요 표준 Annotation과 사용법을 알아봅니다. 3 | 4 | == Table of Contents 5 | 6 | 1. link:./11_deprecated.adoc[@Deprecate] 7 | 2. link:./12_override.adoc[@Override] 8 | 3. link:./13_supresswarning.adoc[@SuppressWarnings] 9 | 4. link:./14_safevarags.adoc[@SaftVarags] 10 | 5. link:./15_functionalinterface.adoc[@FuncationalInterface] 11 | 6. link:./16_lab13-1.adoc[Lab 13-1 Annotation 적용과 사용] 12 | 13 | --- 14 | 15 | link:./09_impl.adoc[이전: 구현부 Annotation] + 16 | link:./11_deprecated.adoc[다음: @Deprecated] -------------------------------------------------------------------------------- /course/Module13_annotation/contents/14_safevarags.adoc: -------------------------------------------------------------------------------- 1 | = @SafeVarags 2 | 3 | * 가변 길이 파라피터 사용시 발생할 수 있는 잠재적 불완전 요소에 대해 보장할 경우 사용 4 | * 재정의 불가 메소드에 대해서만 사용 가능 5 | ** Java 8에서는 static 메소드와 final 인스턴스 메소드에만 적용 가능 6 | ** Java 9부터 private 인스턴스 메소드에도 적용 가능 7 | 8 | --- 9 | 10 | [sourcek java] 11 | ---- 12 | @SafeVarargs 13 | public final void unsaftAdd(T... items) { 14 | Collections.addAll(this.itemList, items); 15 | } 16 | ---- 17 | 18 | @SafeVarargs Annotation이 적용된 메소드 또는 생성자는 가변 길이 파라미터로인해 발생할 수 있는 잠재적인 오류 가능성에 대해 경고하지 않습니다. 이는 메소드나 생성자의 작성자가 가변 길이 파라미터에 대해 안정성을 보장할 경우 해당 메소드나 생성자에 적용합니다. 19 | 20 | @SafeVarargs Annotaation은 해당 메소드나 생성자에 한해 적용되며, 이를 상속받은 메소드나 생성자에는 적용되지 않습니다. 21 | 22 | [source, java] 23 | ---- 24 | public class MyClass { 25 | private List itemList = new ArrayList<>(); 26 | 27 | @SafeVarargs 28 | public final void unsafeAdd(T... items) { 29 | Collections.addAll(this.itemList, items); 30 | } 31 | } 32 | ---- 33 | 34 | --- 35 | 36 | link:./13_supresswarning.adoc[이전: @SupressWarning] + 37 | link:./15_functionalinterface.adoc[다음: @FunctionalInterface] -------------------------------------------------------------------------------- /course/Module13_annotation/contents/15_functionalinterface.adoc: -------------------------------------------------------------------------------- 1 | = @FunctionalInterface 2 | 3 | * Target이 함수형 인터페이스임을 적용 4 | 5 | [source, java] 6 | ---- 7 | @FunctionalInterface 8 | public interface Functional { 9 | int apply(int left, int right); 10 | } 11 | 12 | class Calculate { 13 | public int calc(Functional binder, int i, int j) { 14 | return binder.apply(i, j); 15 | } 16 | } 17 | ---- 18 | 19 | --- 20 | 21 | 함수형 인터페이스는 abstract 메소드가 단 하나만 존재하는 인터페이스를 말합니다. Java의 Lambda Expression은 함수형 인터페이스를 기반으로만 작성할 수 있습니다. 22 | 23 | @FuncationalInterface Annotation은 인터페이스가 함수형 인터페이스임을 적용합니다. 24 | 25 | --- 26 | 27 | link:./14_safevarags.adoc[이전: @safevarags] + 28 | link:./16_lab13-1.adoc[다음: Lab 13-1 Annotation 적용과 사용] -------------------------------------------------------------------------------- /course/Module13_annotation/contents/17_chapter4_meta_annotation.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 4: Meta Annotation 2 | 3 | Java에서 Annotation은 Class, Method, Instance등과 같은 프로그램 요소에 메타 데이터를 첨부하는데 사용됩니다. 일부 Annotation은 다른 Annotation에 주석을 다는데 사용됩니다. 이러한 유형의 Annotation을 Meta Annotation이라고 합니다. 이 단원에서는 주요 Meta Annotation에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./18_retention.adoc[@Retention] 8 | 2. link:./19_documented.adoc[@Documented] 9 | 3. link:./20_target.adoc[@Target] 10 | 4. link:./21_inherited.adoc[@Inherited] 11 | 5. link:./22_repeatable.adoc[@Repeatable] 12 | 13 | --- 14 | 15 | link:./16_lab13-1.adoc[이전: Lab 13-1 Annotation 적용과 사용] + 16 | link:./18_retention.adoc[다음: @Retention] 17 | -------------------------------------------------------------------------------- /course/Module13_annotation/contents/19_documented.adoc: -------------------------------------------------------------------------------- 1 | = @Documented 2 | 3 | Annotation 정보가 javadoc으로 생성한 문서에 포함되도록 함 4 | 5 | [source, java] 6 | ---- 7 | @Documented 8 | @interface CustomAnnotation { 9 | String value(); 10 | } 11 | ---- 12 | 13 | --- 14 | 15 | @Documented 어노테이션은 어노테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 합니다. 16 | 17 | [source, java] 18 | ---- 19 | @Documented 20 | @interface CustomAnnotation { 21 | String value(); 22 | } 23 | ---- 24 | 25 | @Documented 메타 어노테이션이 적용된 CustomAnnotation은 javadoc을 사용한 문서 생성시 생성된 문서에 정보가 포함됩니다. 26 | 27 | [source, java] 28 | ---- 29 | @CustomAnnotation("Hello") 30 | public class DocumentedAnnotationTest { 31 | public static void main(String[] args) { 32 | System.out.println("DocumentedAnnotationTest"); 33 | } 34 | } 35 | ---- 36 | 37 | image:../images/image02.png[] 38 | 39 | --- 40 | 41 | link:./18_retention.adoc[이전: @Retention] + 42 | link:./20_target.adoc[다음: @Target] -------------------------------------------------------------------------------- /course/Module13_annotation/contents/20_target.adoc: -------------------------------------------------------------------------------- 1 | = @Target 2 | 3 | * 해당 사용자 정의 Annotation이 적용될 수 있는 대상을 지정 4 | * 메소드, 생성자, 필드, 지역 변수 등 Annotation이 지정될 대상 지정 5 | * 적용 대상은 ElementType에 정의됨 6 | 7 | [soyrce, java] 8 | ---- 9 | @Target(ElementType.METHOD) 10 | @interface CustomAnnotation { 11 | String value(); 12 | } 13 | ---- 14 | 15 | --- 16 | 17 | @Target 어노테이션은 사용자 정의 애노테이션이 적용될 수 있는 대상을 지정합니다. 대상은 메소드, 생성자, 필드, 지역 변수 등이 될 수 있으며, 대상은 ElementType에 정의되어 있습니다. 18 | 19 | [%header, cols="1,3"] 20 | |=== 21 | |대상| 설명 22 | |ANNOTATION_TYPE| 어노테이션 타입 23 | |CONSTRUCTOR| 생성자 24 | |FIELD| 필드 25 | |LOCAL_VARIABLE| 지역 변수 26 | |METHOD| 메소드 27 | |PACKAGE| 패키지 28 | |PARAMETER| 파라미터 29 | |TYPE| 클래스, 인터페이스, Enum 타입 30 | |=== 31 | @Target 어노테이션은 하나 이상의 대상을 지정할 수 있습니다. 32 | 33 | [source, java] 34 | ---- 35 | @Target({ElementType.METHOD, ElementType.FIELD, ...}) 36 | ---- 37 | 38 | --- 39 | 40 | link:./19_documented.adoc[이전: @Documented] + 41 | link:./21_inherited.adoc[다음: @Inherited] -------------------------------------------------------------------------------- /course/Module13_annotation/contents/21_inherited.adoc: -------------------------------------------------------------------------------- 1 | = @Inherited 2 | 3 | * Annotation이 서브 클래스에 상속되도록 함 4 | * @Inherited Annotation이 적용된 클래스의 서브 클래스는 Annotation을 명시하지 않아도 적용된 것과 같이 인식됨 5 | * 클래스 정의에서만 사용 6 | 7 | [source, java] 8 | ---- 9 | @Inherited 10 | @interface CustomAnnotation { } 11 | 12 | @CustomAnnotation 13 | class BaseClass {} 14 | class DerivedClass extends BaseClass {} // @CustomAnnotation 어노테이션이 적용됨 15 | ---- 16 | 17 | --- 18 | 19 | @Inherited 어노테이션은 어노테이션의 타겟 클래스의 서브 클래스가 필드, 메소드, 생성자뿐만 아니라 어노테이션까지 같이 상속하도록 지정합니다. 20 | 21 | @Inherited 어노테이션은 클래스에만 적용됩니다. 22 | 23 | [source, java] 24 | ---- 25 | @Inherited 26 | @interface CustomAnnotation { } 27 | 28 | @CustomAnnotation 29 | class BaseClass {} 30 | 31 | class DerivedClass extends BaseClass {} // @CustomAnnotation 어노테이션이 적용됨 32 | ---- 33 | 34 | --- 35 | 36 | link:./20_target.adoc[이전: @Target] + 37 | link:./22_repeatable.adoc[다음: @Repeatable] -------------------------------------------------------------------------------- /course/Module13_annotation/contents/23_chapter5_define_type.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 5: 사용자 정의 Annotation 타입 정의 2 | 3 | Java는 사용자의 프로그램에 필요한 사용자 정의 Annotation을 만들 수 있도록 제공합니다. 이 단원에서는 사용자 정의 Annotation을 정의하는 방법에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./24_type_creation.adoc[Annotation 타입 생성] 8 | 2. link:./25_lab13-2.adoc[Lab 13-2 사용자 정의 Annotation Type 생성] 9 | 10 | --- 11 | 12 | link:./22_repeatable.adoc[이전: @Repeatable] + 13 | link:./24_type_creation.adoc[다음: Annotation 타입 생성] -------------------------------------------------------------------------------- /course/Module13_annotation/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module13_annotation/images/image01.png -------------------------------------------------------------------------------- /course/Module13_annotation/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module13_annotation/images/image02.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/Lab 14-1/Solution/DesendingOrder.java: -------------------------------------------------------------------------------- 1 | import java.util.Comparator; 2 | 3 | public class DesendingOrder implements Comparator { 4 | public int compare(User o1, User o2) { 5 | if(o1.getUserAge() > o2.getUserAge()){ 6 | return -1; 7 | }else if( o1.getUserAge() < o2.getUserAge()){ 8 | return 1; 9 | }else { 10 | return 0; 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /course/Module14_collections_framework/Lab 14-1/Solution/User.java: -------------------------------------------------------------------------------- 1 | class User implements Comparable { 2 | private final int userNo; 3 | private final String userName; 4 | private final int userAge; 5 | 6 | public int getUserAge() { 7 | return userAge; 8 | } 9 | 10 | public User(int userNo, String userName, int userAge) { 11 | this.userNo = userNo; 12 | this.userName = userName; 13 | this.userAge = userAge; 14 | } 15 | 16 | public int compareTo(User o) { 17 | if(this.userAge == o.userAge){ 18 | return 0; 19 | }else if(this.userAge < o.userAge){ 20 | return -1; 21 | }else{ 22 | return 1; 23 | } 24 | } 25 | 26 | public String toString() { 27 | return "User {" + 28 | "userNo=" + userNo + 29 | ", userName='" + userName + '\'' + 30 | ", userAge=" + userAge + 31 | '}'; 32 | } 33 | } -------------------------------------------------------------------------------- /course/Module14_collections_framework/Lab 14-1/Solution/Users.java: -------------------------------------------------------------------------------- 1 | import java.util.List; 2 | import java.util.ArrayList; 3 | import java.util.Iterator; 4 | 5 | public class Users { 6 | private List userList = new ArrayList(); 7 | 8 | public void addUser(User user) { 9 | userList.add(user); 10 | } 11 | } -------------------------------------------------------------------------------- /course/Module14_collections_framework/Lab 14-1/Starter/DesendingOrder.java: -------------------------------------------------------------------------------- 1 | import java.util.Comparator; 2 | 3 | public class DesendingOrder { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /course/Module14_collections_framework/Lab 14-1/Starter/Test.java: -------------------------------------------------------------------------------- 1 | import java.util.Collections; 2 | import java.util.List; 3 | import java.util.ArrayList; 4 | 5 | public class Test { 6 | public static void main(String[] args) { 7 | 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /course/Module14_collections_framework/Lab 14-1/Starter/User.java: -------------------------------------------------------------------------------- 1 | class User { //implements Comparable { 2 | private final int userNo; 3 | private final String userName; 4 | private final int userAge; 5 | 6 | public int getUserAge() { 7 | return userAge; 8 | } 9 | 10 | public User(int userNo, String userName, int userAge) { 11 | this.userNo = userNo; 12 | this.userName = userName; 13 | this.userAge = userAge; 14 | } 15 | 16 | // 17 | // To-do: override compareTo method here 18 | // 19 | 20 | // 21 | // To-do: override toString method here 22 | // 23 | } -------------------------------------------------------------------------------- /course/Module14_collections_framework/Lab 14-1/Starter/Users.java: -------------------------------------------------------------------------------- 1 | import java.util.List; 2 | import java.util.ArrayList; 3 | import java.util.Iterator; 4 | 5 | public class Users { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /course/Module14_collections_framework/contents/00_collections_framework.adoc: -------------------------------------------------------------------------------- 1 | = Module 11 Collections Framework 2 | 3 | Java에는 다수의 데이터 또는 데이터 집합을 쉽고 효과적으로 처리할 수 있는 표준화 된 프로그래밍 방식을 제공하는 Collections Framework가 포함되어 있습니다. 4 | 5 | 인터페이스를 사용해서 구현되어 제공되는 풍부한 클래스를 통해서 개발 시간을 단축할 수 있으며, 재사용성 높은 코드를 작성할 수 있습니다. 6 | 7 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 8 | 9 | * 데이터 구조와 알고리즘을 제공하여 프로그래밍 노력을 줄임으로써 높은 수준의 로직을 작성하는데 집중하여, 다른 컬렉션 개발에 집중할 수 있습니다. 10 | * 컬렉션 및 알고리즘을 조작하는데 사용할 표준 인터페이스를 제공하여 소프트웨어 재사용성을 높일 수 있습니다. 11 | 12 | == Table of Contents 13 | 14 | 1. link:./01_chapter1_collections_framework.adoc[Collection] 15 | 2. link:./08_chapter2_iterator_comparable_comparator[Iterator, Comparable, Comparator] 16 | 3. link:./13_chapter3_list.adoc[List] 17 | 4. link:./20_chapter4_set.adoc[Set] 18 | 5. link:./24_chapter5_map.adoc[Map] 19 | 6. link:./29_chapter6_collections_class.adoc[Collections (Util Class)] 20 | 21 | --- 22 | 23 | link:./01_chapter1_collections_framework.adoc[다음: Collections Framework 개요] 24 | -------------------------------------------------------------------------------- /course/Module14_collections_framework/contents/01_chapter1_collections_framework.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 1: Collections Framework 2 | 3 | Java는 JDK 1.2 부터 Collection 클래스와 인터페이스를 포함하는 Collection Framework 개념을 정의하여 포함합니다. 이 장에서는 List와 Set의 상위 개념인 Collection 인터페이스에 대해 알아 봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./02_introduction_collection.adoc[Collections 개요] 8 | 2. link:./03_java_collections_framework.adoc[Java Collections Framework] 9 | 3. link:./04_collection_stored_structure.adoc[Collections 클래스의 저장 구조] 10 | 4. link:./05_java_collections_framework_org.adoc[Java Collections Framework 구성] 11 | 5. link:./06_collection_interface.adoc[Collection 인터페이스] 12 | 6. link:./07_collection_interface_methods.adoc[Collection 인터페이스 메소드] 13 | 14 | --- 15 | 16 | link:./00_collections_framework.adoc[이전: Module 11 Collections Framework] + 17 | link:./02_introduction_collection.adoc[다음: Collection 개요] -------------------------------------------------------------------------------- /course/Module14_collections_framework/contents/08_chapter2_iterator_comparable_comparator.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 2: Iterator, Comparable, Comparator 2 | 3 | Iterator는 사전적 의미로는 반복자를 의미하며, 데이터가 집합된 자료 구조에서 데이터를 추출하는데 이용됩니다. Comparable은 같은 타입의 인스턴스를 비교하고 반환 값을 기준으로 정렬합니다. 이 장에서는 Collection의 탐색, 비교 및 정렬에 대해서 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | * Iterable과 Iterator 8 | * Comparable 9 | * Comparator 10 | 11 | --- 12 | 13 | link:./07_collection_interface_methods.adoc[이전: Collection 인터페이스 메소드] + 14 | link:./09_iterable_iterator.adoc[다음: Iterable과 Iterator] -------------------------------------------------------------------------------- /course/Module14_collections_framework/contents/13_chapter3_list.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 3: List 2 | 3 | List는 요소(Element)간의 순서가 있고, 크기가 가변적인 자료구조입니다. 이 장에서는 List의 구현체인 Vector, LinkedList, ArrayList, Stack에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 1. link:./14_list_interface.adoc[List 인터페이스] 7 | 2. link:./15_arraylist.adoc[ArrayList] 8 | 3. link:./16_linkedlist.adoc[LinkedList] 9 | 4. link:./17_queue_interface.adoc[Queue] 10 | 5. link:./18_vector.adoc[Vector] 11 | 6. link:./19_stack.adoc[Stack] 12 | 13 | --- 14 | 15 | link:./12_lab14-1.adoc[이전: Lab 14-1 Collection 인터페이스를 구현하는 클래스 구현] + 16 | link:./14_list_interface.adoc[다음: List 인터페이스] 17 | 18 | -------------------------------------------------------------------------------- /course/Module14_collections_framework/contents/18_vector.adoc: -------------------------------------------------------------------------------- 1 | = Vector 2 | 3 | * Collection Framework가 추가되기 전에 추가된 레거시 클래스 4 | * ArrayList와 유사하며, 지네릭스를 사용할 수 있도록 재 설계됨 5 | ** List 인터페이스를 구현하여 크기가 가변적으로 변경됨 6 | ** Vector를 개선하여 작성된 ArrayList보다 성능이 떨어짐 7 | * 스레드에 안전하나, 동기화 비용이 발생하여 ArrayList 보다 성능이 떨어짐 8 | 9 | --- 10 | 11 | Vector는 레거시 클래스로, 기능이 개선된 ArrayList가 추가되어 더 이상 사용할 필요가 없으나 코드 호환성을 위해 남아있는 List 구현체입니다. List 인터페이스를 구현하므로 ArrayList와 동일하게 동작합니다. 레거시 코드와의 호환 문제가 아니라면 Vector보다 ArrayList를 사용하는 것이 좋습니다. 12 | 13 | image:../images/image07.png[] 14 | 15 | *Vector와 ArrayList* 16 | 17 | [cols="1,2,3" options="header"] 18 | |=== 19 | | |Vector|ArrayList 20 | |동기화|한번에 하나의 쓰레드에 접근 가능|동시에 여러 쓰레드가 작업할 수 있음 21 | |스레드 안전|Thread Safe|명시적인 Thread Safe 22 | |성능|느림|빠름(동기화가 되어 있지 않음) 23 | |크기증가|Vector Size의 100% 증가|ArrayList Size의 50% 증가 24 | |=== 25 | 26 | --- 27 | 28 | link:./17_queue_interface.adoc[이전: Queue 인터페이스] + 29 | link:./19_stack.adoc[다음: Stack] 30 | 31 | -------------------------------------------------------------------------------- /course/Module14_collections_framework/contents/20_chapter4_set.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 4: Set 2 | Set은 수학에서 말하는 집합과 유사한 자료구조를 표현합니다. Set 인터페이스는 집합과 유사하게 데이터의 중복을 허용하지 않으며 저장 순서가 유지되지 않습니다. 이 장에서는 Set 인터페이스의 구현체인 SortedSet, HashSet, TreeSet에 대해 학습합니다. 3 | 4 | == Table of Contents 5 | 6 | 1. link:./21_set_interface.adoc[Set 인터페이스] 7 | 2. link:./22_hashset.adoc[HashSet] 8 | 3. link:./23_treeset.adoc[TreeSet] 9 | 10 | --- 11 | 12 | link:./19_stack.adoc[이전: Stack] + 13 | link:./21_set_interface.adoc[다음: Set 인터페이스] 14 | -------------------------------------------------------------------------------- /course/Module14_collections_framework/contents/21_set_interface.adoc: -------------------------------------------------------------------------------- 1 | = Set 인터페이스 2 | 3 | * 집합과 유사한 자료구조 표현 4 | * 중복된 요소를 허용하지 않음 5 | * 저장 순서를 유지하지 않음 6 | * HashSet, LinkedHashSet, TreeSet등으로 구현됨 7 | 8 | image:../images/image09.png[] 9 | 10 | --- 11 | 12 | Set은 수학에서의 집합과 유사한 동작을 수행하는 자료구조이며, Java에서는 Set 인터페이스를 통해 구현합니다. Set은 중복되는 요소를 허용하지 않으며, 저장 순서를 유지하지 않습니다. (LinkedHashSet 예외) 13 | 14 | List와 가장 다른 점은, 중복되는 요소를 허용하지 않는다는 것입니다. 15 | 16 | *주요 메소드* 17 | [cols="1, 3" options="header"] 18 | |=== 19 | |Method|설명 20 | |public boolean add(E item) |지정된 요소가 없을 경우 Set에 요소를 추가합니다.
지정된 요소가 존재하는 경우 false를 반환합니다. 21 | |public boolean remove(Object o)|지정된 객체가 존재하는 경우 해당 요소를 제거합니다.
요소가 없는 경우 false를 반환합니다. 22 | |public boolean contains(Object o)|지정된 요소가 집합에 있는지 확인합니다. 23 | |public boolean equals(Object o)|지정된 객체와 현재 집합이 같은지 비교합니다. 24 | |public boolean isEmpty()|집합이 비어있을 경우 true를, 아닌 경우 false를 반환합니다. 25 | |public int size()|집합에 포함된 요소의 수를 반환합니다. 26 | |public void clear()|집합의 모든 요소를 제거합니다. 27 | |=== 28 | 29 | --- 30 | 31 | link:./20_set.adoc[이전: Set] + 32 | link:./22_hashset.adoc[다음: HashSet] 33 | 34 | 35 | -------------------------------------------------------------------------------- /course/Module14_collections_framework/contents/24_chapter5_map.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 5: Map 2 | 3 | Map은 key/value로 이루어져 하나의 쌍으로 묶인 데이터를 저장하는 Collection을 의미합니다. 이 장에서는 HashMap, HashTable, TreeMap, Properties등 Map을 구현하는 자료구조에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./25_map_interface.adoc[Map 인터페이스] 8 | 2. link:./26_hashmap.adoc[HashMap] 9 | 3. link:./27_hashtable.adoc[HashTable] 10 | 4. link:./28_treemap.adoc[TreeMap] 11 | 12 | --- 13 | 14 | link:./23_treeset.adoc[이전: TreeSet] + 15 | link:./25_map_interface.adoc[다음: Map 인터페이스] -------------------------------------------------------------------------------- /course/Module14_collections_framework/contents/29_chapter6_collections_class.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 6: Collections 클래스 2 | 3 | java.util 패키지의 Collection 클래스는 Collection 인터페이스를 구현하는 인스턴스를 반환하는 static 메소드로 구성된 유틸리티 클래스로, collection을 위한 많은 동작들을 포함하고 있습니다. 이 장에서는 Collections 클래스가 제공하는 기능들에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./30_collections_overview.adoc[Collections 클래스] 8 | 2. link:./31_collections_concurrency_control.adoc[Collection 동기화] 9 | 3. link:./32_readonly_collection.adoc[Unmodifiable Collection] 10 | 4. link:./33_checked_collection.adoc[Checked Collection] 11 | 12 | --- 13 | 14 | link:./28_treemap.adoc[이전: TreeMap] + 15 | link:./30_collections_overview.adoc[다음: Collections 클래스 개요] 16 | -------------------------------------------------------------------------------- /course/Module14_collections_framework/contents/31_collections_concurrency_control.adoc: -------------------------------------------------------------------------------- 1 | = Collections 동시성 처리 2 | 3 | * 멀티스레드 환경에서는 동시성 처리가 필요함 4 | ** 하나의 Collection 객체에 여러 스레드가 접근할 때 5 | ** 데이터 일관성을 위한 Synchronize 처리가 필요 6 | * Vector와 Hashtable은 동시성을 처리하도록 설계됨 7 | ** 동시성 처리는 느리므로, 비 멀티스레드 환경을 위해 ArrayList, HashMap등을 사용 8 | * ArrayList, HashMap등에 동시성 제어가 필요할 때 Collections 클래스를 사용 9 | 10 | [source, java] 11 | ---- 12 | List list = Collections.synchronizedList(new ArrayList()); 13 | ---- 14 | 15 | --- 16 | 17 | Collection Framework의 Vector와 Hashtable 객체에는 멀티스레드 환경에서 데이터 일관성을 위한 처리가 되어있지만, Synchronize 처리를 위한 비용을 줄이기 위해 비 멀티스레드 환경에서는 ArrayList, HashMap등 Synchronize가 없는 객체를 사용합니다. 18 | 19 | ArrayList, HashMap등 동시성 처리가 되어 있지 않은 객체에 동시성 처리가 필요할 때, Collections 클래스의 synchronizeList, SynchronizedSet, SynchronizedMap등의 동시성 지원 메소드를 사용할 수 있습니다. 20 | 21 | --- 22 | 23 | link:./30_collections_overview.adoc[이전: Collections 클래스 개요] + 24 | link:./32_readonly_collection.adoc[다음: 읽기 전용 Collection] -------------------------------------------------------------------------------- /course/Module14_collections_framework/contents/32_readonly_collection.adoc: -------------------------------------------------------------------------------- 1 | = 읽기 전용 Collection 2 | 3 | * Collection에 저장된 데이터를 읽기전용으로 만듦 4 | * 외부에서 변경할 수 없으므로 데이터의 무결성이 보장됨 5 | * 읽기전용으로 설정된 Collection의 요소에 변경을 시도하면 UnsupportedOperationException 발생 6 | 7 | [source, java] 8 | ---- 9 | List list = new ArrayList(); 10 | list = Collections.unmodifiableList(list); 11 | ---- 12 | 13 | --- 14 | 15 | Collection 객체는 자유롭게 데이터를 추가하고, 읽고, 수정하고, 지울 수 있습니다. Collection이 한번 생성된 후 데이터의 무결성을 위해 수정이 불가능해야 하는 경우, Collections 클래스의 unmodifiableList, unmodifiableSet, unmodifiableMap 메소드를 사용해 읽기 전용으로 설정할 수 있습니다. 16 | 17 | [source, java] 18 | ---- 19 | List list = new ArrayList(){{ 20 | add("red"); 21 | add("green"); 22 | add("blue"); 23 | }}; 24 | 25 | list = Collections.unmodifiableList(list); 26 | 27 | try { 28 | list.add("pink"); 29 | } 30 | catch (UnsupportedOperationException e){ 31 | e.printStackTrace(); 32 | } 33 | ---- 34 | 35 | --- 36 | 37 | link:./31_collections_concurrency_control.adoc[이전: Collections 동시성 처리] + 38 | link:./33_checked_collection.adoc[다음: Checked Collection] -------------------------------------------------------------------------------- /course/Module14_collections_framework/contents/33_checked_collection.adoc: -------------------------------------------------------------------------------- 1 | = Checked Collection 2 | 3 | * Collection에 단일 타입의 객체를 저장하고자 할 때 사용 4 | * 지정된 타입 외 다른 타입이 저장될 때 ClassCast Exception 사용 5 | ** checkedList, checkedSet, checkedMap 메소드 지원 6 | 7 | [source, java] 8 | ---- 9 | List colors = Collections.checkedList(new ArrayList(),String.class); 10 | ---- 11 | 12 | --- 13 | 14 | 일반적으로 Collection 클래스에는 다양한 타입의 객체를 저장할 수 있습니다. 한 가지 타입의 객체를 저장하고자 한다면 checked 형태의 collection을 사용할 수 있습니다. 15 | 16 | Collections 클래스에서 제공하는 checklist, checkedSet, checkedMap 메소드를 사용하여 단일 타입만 저장 가능한 Collection을 생성할 수 있습니다. 17 | 18 | [source, java] 19 | ---- 20 | List colors = Collections.checkedList(new ArrayList(),String.class) ; 21 | colors.add("white"); 22 | colors.add("black"); 23 | colors.add("green"); 24 | colors.add("pink"); 25 | 26 | try { 27 | colors.add(123); 28 | } 29 | catch (ClassCastException e){ 30 | System.out.println(e.getMessage()); 31 | } 32 | 33 | colors.forEach(color->{ 34 | System.out.println(color); 35 | }); 36 | ---- 37 | 38 | --- 39 | 40 | link:./32_readonly_collection.adoc[이전: 읽기 전용 Collection] + 41 | link:./34_review.adoc[다음: 검토] -------------------------------------------------------------------------------- /course/Module14_collections_framework/contents/34_review.adoc: -------------------------------------------------------------------------------- 1 | = 검토 2 | 3 | * Collection 개요 4 | * Iterator, Comparable, Comparator 5 | * List 6 | * Set 7 | * Map 8 | * Collections 클래스 9 | 10 | --- 11 | 12 | == Quiz 13 | 14 | 1. Collection Framework를 구성하는 인터페이스와 클래스에 대해 설명하고 클래스 다이어그램을 작성하세요 15 | 2. List, Set, Map 컬렉션의 차이에 대해 설명하세요. 16 | 3. Iterable 인터페이스와 Iterator 인터페이스의 메소드를 기술하세요. 17 | 4. ArrayList와 Vector의 차이점에 대해 설명하세요 18 | 19 | --- 20 | 21 | link:./33_checked_collection.adoc[이전: Checked Collection] -------------------------------------------------------------------------------- /course/Module14_collections_framework/homework_1/dictionary.adoc: -------------------------------------------------------------------------------- 1 | = 사전 앱 작성 2 | 3 | Java의 Collections Framework에서 제공하는 여러 클래스 중, 가장 걸맞은 자료구조를 선택하여 아래 요구사항을 만족하는 프로그램을 작성하세요. 4 | 5 | 1. 프로그램이 실행되면 words.txt 파일을 로드하여 단어들을 메모리에 로드합니다. 6 | 2. 로드가 끝나면 "검색할 단어를 입력하세요: " 라는 프롬프트를 출력합니다. 7 | 3. 프롬프트에 단어를 입력하면 검색 결과를 보여줍니다. 8 | 4. exit() 를 입력하면 프로그램을 종료합니다. -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image01.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image02.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image03.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image04.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image05.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image06.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image07.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image08.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image09.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image10.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image11.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image12.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image13.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image14.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image15.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image16.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/images/image17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/images/image17.png -------------------------------------------------------------------------------- /course/Module14_collections_framework/labfiles/lab14-1a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/labfiles/lab14-1a.zip -------------------------------------------------------------------------------- /course/Module14_collections_framework/labfiles/lab14-1b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/labfiles/lab14-1b.zip -------------------------------------------------------------------------------- /course/Module14_collections_framework/labfiles/lab14-3b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module14_collections_framework/labfiles/lab14-3b.zip -------------------------------------------------------------------------------- /course/Module15_stream/contents/01-1_introduction_to_stream.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 1: Stream 소개 2 | 3 | Java의 Stream은 Java 8에서 도입된 기능으로, 데이터의 연속적인 흐름(stream)을 처리하기 위한 선언형(declarative) 방식의 API입니다. 이를 통해 컬렉션, 배열 또는 I/O 채널과 같은 데이터 소스를 함수형 프로그래밍 스타일로 처리할 수 있습니다. Stream을 사용하면 데이터를 효율적으로 필터링, 매핑, 정렬, 집계 등의 작업을 수행할 수 있습니다. 4 | 5 | 이 단원에서는 Stream에 대해 간략히 알아봅니다. 6 | 7 | == Table of Contents 8 | 9 | 1. link:./01-2_concept.adoc[Stream의 개념과 정의] 10 | 2. link:./01-3_characteristic.adoc[Stream의 특징] 11 | 3. link:./01-4_stream_collection.adoc[Stream과 컬렉션의 차이점] 12 | 4. link:./01-5_streamapi_benefit.adoc[Stream API의 장점] 13 | 14 | --- 15 | 16 | link:./00_introduction.adoc[이전: Module 18: Stream] + 17 | link:./01-2_concept.adoc[다음: Stream의 개념과 정의] 18 | -------------------------------------------------------------------------------- /course/Module15_stream/contents/02-1_usage.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 2: Stream 사용법 2 | 3 | Java의 Stream API는 데이터를 선언적이고 함수형 프로그래밍 스타일로 처리할 수 있도록 도와줍니다. Stream API를 활용하려면 기본적인 사용 단계를 이해해야 합니다 4 | 5 | 이 단원에서는 Stream API의 기본적인 사옹 방법을 알아봅니다. 6 | 7 | == Table of Contents 8 | 9 | 1. link:./02-2_stream_from_collection.adoc[Collection 기반 Stream] 10 | 2. link:./02-3_stream_from_array.adoc[배열 기반 Stream] 11 | 3. link:./02-4_stream_from_file.adoc[파일 기반 Stream] 12 | 4. link:./02-5_stream_from_iterable.adoc[Iterable 기반 Stream API] 13 | 5. link:./02-6_stream_builder.adoc[Stream.builder()] 14 | 6. link:./02-7_how_stream_works.adoc[Stream의 작동 원리] 15 | 7. link:./02-8_stream_lifecycle.adoc[Stream의 라이프사이클] 16 | 17 | --- 18 | 19 | link:./01-5_streamapi_benefit.adoc[이전: Stream API의 장점] + 20 | link:./02-2_stream_from_collection.adoc[다음: Collection 기반 API] -------------------------------------------------------------------------------- /course/Module15_stream/contents/02-3_stream_from_array.adoc: -------------------------------------------------------------------------------- 1 | = 배열 기반 Stream API 2 | 3 | * 배열을 stream으로 변환 4 | * Arrays.stream 메소드 사용용 5 | 6 | --- 7 | 8 | 배열을 스트림으로 변환하여 데이터를 처리할 수 있습니다. 이를 통해 데이터의 순차적 또는 병렬 처리, 필터링, 변환, 집합 연산 등을 더욱 직관적이고 간결하게 할 수 있습니다. 9 | 10 | == Stream 생성 11 | 12 | 배열을 Stream으로 생성하기 위해서는 Arrays 클래스의 stream 메소드를 사용합니다. 13 | 14 | [source, java] 15 | ---- 16 | int[] numbers = {1, 2, 3, 4, 5}; 17 | int sum = Arrays.stream(numbers) // 배열을 스트림으로 변환 18 | .filter(n -> n % 2 == 0) // 짝수만 필터링 19 | .sum(); // 결과 합산 20 | System.out.println(sum); // 출력: 6 (2 + 4) 21 | ---- 22 | 23 | 생성된 스트림은 Collection 기반 스트림과 사용이 동일합니다. 24 | 25 | --- 26 | 27 | link:./02-2_stream_from_collection.adoc[이전: Collection 기반 Stream API] + 28 | link:./02-4_stream_from_file.adoc[다음: File 기반 Stream API] -------------------------------------------------------------------------------- /course/Module15_stream/contents/03-1_intermediate_operations.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 3: 중간 연산 2 | 3 | Java Stream의 **중간 연산(Intermediate Operations)**은 스트림에서 데이터를 변환하거나 필터링하는 작업을 수행하는 단계입니다. 중간 연산은 지연 실행(Lazy Evaluation) 특성을 가지며, 최종 연산(Terminal Operation)이 호출될 때까지 실제로 실행되지 않습니다. 4 | 5 | 이 단원에서는 Java Stream API에서 지원하는 중간 연산에 대해 알아봅니다. 6 | 7 | == Table of Contents 8 | 9 | 1. link:./03-2_concept.adoc[중간 연산 개요] 10 | 2. link:./03-3_filtering.adoc[필터링] 11 | 3. link:./03-4_mapping.adoc[매핑] 12 | 4. link:./03-5_sorting.adoc[정렬] 13 | 5. link:./03-6_limit_skip.adoc[제한 및 건너뛰기] 14 | 15 | --- 16 | 17 | link:./02-8_stream_lifecycle.adoc[이전: Stream 라이프사이클] + 18 | link:./03-2_concept.adoc[다음: 중간 연산 개요] -------------------------------------------------------------------------------- /course/Module15_stream/contents/04-1_terminal_operation.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 4: 최종 연산 2 | 3 | **Java Stream의 최종 연산(Terminal Operations)**은 스트림의 데이터를 처리한 결과를 반환하거나 실행을 완료하는 작업입니다. 4 | 5 | 이 단원에서는 Stream API의 최종 연산에 대해 알아봅니다. 6 | 7 | == Table of Contents 8 | 9 | 1. link:./04-2_concept.adoc[최종 연산 개요] 10 | 2. link:./04-3_consume.adoc[데이터 소비] 11 | 3. link:./04-4_aggregation.adoc[집계] 12 | 4. link:./04-5_collection_transfer.adoc[컬렉션 변환] 13 | 5. link:./04-6_matching.adoc[매칭] 14 | 6. link:./04-7_find.adoc[요소 찾기] 15 | 16 | --- 17 | 18 | link:./03-6_limit_skip.adoc[이전: 제한 및 건너뛰기] + 19 | link:./04-2_concept.adoc[다음: 최종 연산 개요] -------------------------------------------------------------------------------- /course/Module15_stream/contents/04-7_find.adoc: -------------------------------------------------------------------------------- 1 | = 요소 찾기 -------------------------------------------------------------------------------- /course/Module16_thread/contents/00_introduction.adoc: -------------------------------------------------------------------------------- 1 | = Module 16: Thread 2 | 3 | Thread(Thread)란 프로세스 내에서 실행되는 여러 개의 실행 단위로, 경량화 프로세스라고 부르기도 합니다. 한 프로그램은 하나의 Thread에서 실행되지만, 프로그래밍 환경에 따라서 하나 이상의 Thread를 실행할 수 있습니다. 이 모듈에서는 Java의 Thread 프로그래밍에 대해 학습합니다. 4 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 5 | 6 | * 운영체제의 프로세스(Process)에 대해 이해합니다. 7 | * 단일 Thread(Single Thread)와 다중 Thread(Multi Thread)에 대해 이해합니다. 8 | * Java 프로그래밍 언어로 멀티 Thread 응용 프로그램을 개발할 수 있습니다. 9 | 10 | == Table of contents 11 | 12 | 1. link:./01-1_basic_unix_commands.adoc[기본 유닉스 명령어] 13 | 2. link:./02-1_process.adoc[프로세스 개요] 14 | 3. link:./03-1_thread.adoc[Thread 개요] 15 | 4. link:./04-1_java_thread_programming.adoc[Java Thread Programming] 16 | 17 | --- 18 | 19 | link:./01-1_basic_unix_commands.adoc[다음: 기본 유닉스 명령어] 20 | 21 | -------------------------------------------------------------------------------- /course/Module16_thread/contents/01-1_basic_unix_commands.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 1: 기본 유닉스 명령어 2 | 3 | 현대 운영체제의 기본이 된 유닉스는 체계적이고 조합 가능한 기본 명령 체계를 가지고 있습니다. 이 단원에서는 유닉스에서 필수적으로 알고 익숙해져야 하는 명령어들과 사용 방법을 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./01-2_directory_folder.adoc[디렉토리와 폴더] 8 | 2. link:./01-3_unix_directory.adoc[유닉스 디렉토리] 9 | 3. link:./01-4_basic_commands.adoc[유닉스 기본 명령어] 10 | 4. link:./01-5_standard_stream.adoc[표준 스트림] 11 | 5. link:./01-6_pipe.adoc[파이프] 12 | 6. link:./01-7_io_redirection.adoc[I/O 리다이렉션] 13 | 14 | --- 15 | 16 | link:./00_introduction.adoc[이전: Module 16: Thread] + 17 | link:./03_디렉토리와_폴더.adoc[다음: 디렉토리와 폴더] -------------------------------------------------------------------------------- /course/Module16_thread/contents/01-7_io_redirection.adoc: -------------------------------------------------------------------------------- 1 | = I/O 리다이렉션 2 | 3 | * 유닉스 계열 운영체제에서 제공되는 표준 스트림 재지정 4 | * 입 출력 대상으로 표준 입력, 표준 출력, 표준 오류를 사용하지 않고 다른 경로인 파일로 재지정 5 | * 명령은 리다이렉션을 통해 파일로부터 입력 받을 수 있고, 파일로 출력할 수 있음 6 | * 입출력 재지정을 통해 입력의 방향을 변경할 수 있음 7 | 8 | --- 9 | 10 | 리다이렉션(Redirection)은 유닉스 계열 운영체제(Windows에서도 어느정도로)에서 제공되는 표준 스트림을 재지정할 수 있는 메커니즘입니다. I/O 리다이렉션을 사용하면 입 출력 대상으로 STDIN, STDOUT, STDERR를 사용하지 않고 다른 파일을 경로로 지정할 수 있습니다. 11 | 12 | 파이프라인의 첫 번째 명령에게 입력을 전달할 때 키보드를 사용하지 않고 파일을 입력으로 전달한다거나, 파이프라인의 명령이 결과를 터미널이 아닌 파일로 출력하고자 할 때 I/O 리다이렉션을 사용할 수 있습니다. 13 | 14 | **입력 리다이렉션: <** + 15 | 지정된 파일의 내용을 표준 입력으로 넘겨줍니다. 16 | 17 | **출력 리다이렉션 (Overwrite): >** + 18 | 표준 출력에 전달된 내용을 지정된 파일로 넘겨줍니다. 기존 파일의 내용을 무시하고 새 내용으로 덮어씁니다. 19 | 20 | **출력 리다이렉션 (Append): >>** 21 | 표준 출력에 전달된 내용을 지정된 파일로 넘겨줍니다. 스트림으로 전달되는 내용을 기존 파일의 내용에 추가합니다. 22 | 23 | **오류 출력 리다이렉션: 2>** + 24 | 오류 출력을 해당 파일로 넘겨줍니다. 25 | 26 | **Here Document: <<** + 27 | 구분자를 통해 “여기까지가 문서”임을 나타냅니다. 일반적으로 EOF를 구분자로 사용합니다. 28 | 29 | --- 30 | 31 | link:./01-6_pipe.adoc[이전: 파이프] + 32 | link:./02-1_프로세스.adoc[다음: Chapter 2: 프로세스] -------------------------------------------------------------------------------- /course/Module16_thread/contents/02-1_process.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 2: 프로세스 2 | 3 | 프로세스(Process)는 실행중인 프로그램으로 생각할 수 있습니다. 대부분의 시스템에서 프로세스는 작업(Task)의 단위가 되며, 시스템은 프로세스들의 집합으로 생각할 수 있습니다. 이 단원에서는 프로세스에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./02-2_introduction_process.adoc[프로세스 개요] 8 | 2. link:./02-3_process.adoc[프로세스] 9 | 3. link:./02-4_process_status.adoc[프로세스 상태] 10 | 4. link:./02-5_process_control_bloack.adoc[프로세스 제어 블록] 11 | 5. link:./02-6_process_communication.adoc[프로세스 스케줄링] 12 | 6. link:./02-7_sleep_wakeup.adoc[잠자기와 깨우기] 13 | 14 | --- 15 | 16 | link:./01-7_io_redirection.adoc[이전: I/O 리다이렉션] + 17 | link:./02-2_introduction_process.adoc[다음: Chapter 2: 프로세스 개요] -------------------------------------------------------------------------------- /course/Module16_thread/contents/02-3_process.adoc: -------------------------------------------------------------------------------- 1 | = 프로세스 2 | 3 | image:../images/image08.png[] 4 | 5 | --- 6 | 7 | 프로세스의 메모리에는 일반적으로 아래와 같이 여러 섹션으로 구분되어 배치됩니다. 8 | 9 | * 텍스트 섹션 + 10 | 코드를 실행하기 위해 저장된 영역으로, 코드 섹션이라고도 부릅니다. 프로그램을 실행시키기 위해 구성되는 것들이 저장되는 영역입니다. 명령문이 저장되며, 제어문, 함수, 상수 등 또한 저장됩니다. 프로그램의 실행 동안 크기가 고정됩니다. 11 | 12 | * 데이터 섹션 + 13 | 전역 변수, static 변수 등이 저장됩니다. 일반적으로 응용 프로그램 진입(Application Entry Point 함수 실행)전에 선언되어 프로그램의 종료시까지 메모리에 남아 있습니다. 초기화 된 변수 영역(Initialized Data segment)와 초기화 되지 않은 변수 영역(Uninitialized data segment)로 나뉘며, 초기화 되지 않은 변수 영역은 BSS(Block Started by Symbol)이라고도 부릅니다. 14 | 15 | * 힙 섹션 + 16 | 사용자에 의해 관리되는 영역으로, 동적으로 할당되는 변수와 Java, C++등의 언어에서 new 연산자로 생성되는 참조 타입의 객체들이 저장되는 영역입니다. 17 | 18 | * 스택 섹션 + 19 | 함수를 호출할 때 함수의 매개변수, 지역변수, 복귀 주소등을 포함하는 활성화 레코드(Activation Record)가 저장되는 영역입니다. 20 | 21 | 프로세스는 다른 개체를 위한 실행 환경으로 동작할 수 있습니다. Java 프로그래밍 환경이 좋은 예입니다. 대부분의 상황에서 실행 가능한 Java 프로그램은 Java Virtual Machine에서 실행됩니다. JVM은 적재된 Java 코드를 해석하고 그 코드를 대신하여 원 기계어를 이용하여 실행하는 프로세스입니다. Java 명령어는 JVM을 보통의 프로세스처럼 실행시키고, JVM은 Java로 작성된 프로그램을 가상 기계에서 실행합니다. 22 | 23 | --- 24 | 25 | link:./02-2_introduction_process.adoc[이전: 프로세스 개요] + 26 | link:./02-4_process_status.adoc[다음: 프로세스 상태] -------------------------------------------------------------------------------- /course/Module16_thread/contents/02-4_process_status.adoc: -------------------------------------------------------------------------------- 1 | = 프로세스 상태 2 | 3 | image:../images/image09.png[] 4 | 5 | --- 6 | 7 | 프로세스는 실행되면서 그 상태가 변화합니다. 프로세스의 상태는 부분적으로 그 프로세스의 활동에 따라 정의됩니다. 8 | 하나의 프로그램이 실행되면 그 프로그램에 대응되는 프로세스가 생성되어 Ready 리스트의 끝에 들어갑니다. Ready 리스트 상의 다른 프로세스들이 CPU를 할당 받아 Ready 리스트를 떠나면 프로세스는 리스트의 앞으로 이동하고 CPU를 사용할 수 있게 됩니다. 9 | 10 | **프로세스 상태 변화** 11 | 12 | * Dispatch + 13 | Ready 리스트의 맨 앞에 있던 프로세스가 CPU를 점유하게 되는 것, 즉 준비 상태에서 실행 상태로 바뀌는 것을 디스패치라고 합니다. 14 | 15 | * Block + 16 | 실행 상태의 프로세스가 허가된 시간을 다 쓰기 전에 입출력 동작을 필요로 하는 경우 프로세스는 CPU를 스스로 반납하고 보류 상태로 넘어 간다. 이것을 보류라고 하며 다음과 같이 표시한다. 17 | 18 | * Wakeup + 19 | 입출력 작업 종료 등 기다리던 사건이 일어났을 때 보류 상태에서 준비 상태로 넘어갑니다. 20 | 21 | * Timeout + 22 | 운영체제는 프로세스가 프로세서를 계속 독점해서 사용하지 못하게 하기 위해 clock interrupt를 두어서 프로세스가 일정 시간 동안만 (시분할 시스템의 time slice) 프로세서를 점유할 수 있게 합니다. 23 | 24 | --- 25 | 26 | link:./02-4_process.adoc[이전: 프로세스] + 27 | link:./02-5_process_control_block.adoc[다음: 프로세스 제어블록] -------------------------------------------------------------------------------- /course/Module16_thread/contents/03-1_thread.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 3: Thread 2 | 3 | Java는 Multi Thread를 지원합니다. 이 장에서는 Java에서 Thread 관련 클래스를 사용하여 멀티 Thread 프로그램을 구현하는 방법에 대해 공부합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03-2_introduction_thread.adoc[Thread 개요] 8 | 2. link:./03-3_process_thread.adoc[프로세스와 Thread] 9 | 3. link:./03-4_thread_benefit.adoc[Thread의 장점] 10 | 11 | --- 12 | 13 | link:./02-10_process_scheduleing.adoc[이전: 프로세스 스케줄링] + 14 | link:./03-2_introduction_thread.adoc[다음: Thread 개요] -------------------------------------------------------------------------------- /course/Module16_thread/contents/04-1_java_thread_programming.adoc: -------------------------------------------------------------------------------- 1 | = Java Thread 프로그래밍 2 | 3 | Java는 멀티 Thread를 지원합니다. 이 단원에서는 Java에서 Thread 관련 클래스를 사용하여 멀티 Thread 프로그램을 구현하는 방법에 대해 공부합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./04-2_main_thread.adoc[Main Thread] 8 | 2. link:./04-3_thread_creation_and_run[Thread 생성과 실행] 9 | 3. link:./04-4_multi_thread_priority.adoc[멀티 Thread와 우순선위] 10 | 4. link:./04-5_thread_concurrency_control.adoc[Thread 동시성 제어] 11 | 5. link:./04-6_thread_status_changes.adoc[Thread 생성과 실행] 12 | 13 | --- 14 | 15 | link:./03-4_thread_benefit.adoc[이전: Thread 장점] + 16 | link:./04-2_main_thread.adoc[다음: Main Thread] -------------------------------------------------------------------------------- /course/Module16_thread/contents/04-4_multi_thread_priority.adoc: -------------------------------------------------------------------------------- 1 | = Java 멀티 Thread와 우선 순위 2 | 3 | * Java는 멀티 Thread를 지원 4 | * 프로그램 내에서 두 개 이상의 동작을 동시에 실행 5 | ** CPU 활동을 극대화 6 | ** 두 Thread가 동작을 동시에 실행 7 | * 하나의 프로세스를 다수의 실행단위로 구분하여 자원을 공유 8 | ** 자원의 생성과 관리의 중복성 최소화 9 | ** 수행 능력 향상 10 | * Thread 우선 순위 11 | ** Java Thread는 우선순위 기반 Round Robin 방식으로 스케줄링됨 12 | ** setPriority() 메소드를 이용해 우선순위 지정 13 | 14 | --- 15 | 16 | 멀티 Thread는 동시성(Concurrenty) 또는 병렬성(Parallelism)으로 실행됩니다. 동시성은 다중 작업을 위해 하나의 코어에서 여러 개의 Thread가 번갈아가며 실행되는 것이고, 병렬성은 다중 작업을 위해 여러 개의 코어에서 각각의 Thread를 동시에 실행하는 성질을 말합니다. 17 | 18 | image:../images/image14.png[] 19 | 20 | Java의 Thread 스케줄링은 우선순위 기반 라운드 로빈 방식으로 스케줄링됩니다. 우선순위 방식은 Thread 객체에 우선 순위 번호를 부여하는 방식으로 제어합니다. 우선 순위방식은 1부터 10까지의 범위로 설정할 수 있으며, 우선순위를 부여하지 않으면 기본적으로 5의 우선순위를 부여 받습니다. 우선순위의 변경을 위해서 setPriority 메소드를 이용할 수 있습니다. 21 | setPriority 메소드에 Thread 클래스의 Thread 우선순위 상수를 이용할 수도 있습니다. 22 | 23 | [cols="1,3" options=header] 24 | |=== 25 | |상수 |값 26 | |MAX_PRIORITY |10 27 | |NORM_PRIORITY |5 28 | |MIN_PRIORITY |1 29 | |=== 30 | 31 | --- 32 | 33 | link:./04-3_thread_creation_and_run.adoc[이전: Java에서 Thread 생성과 싷행] + 34 | link:./27_Thread와_동시성_제어_.adoc[다음: Thread 동시성 제어] -------------------------------------------------------------------------------- /course/Module16_thread/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image01.png -------------------------------------------------------------------------------- /course/Module16_thread/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image02.png -------------------------------------------------------------------------------- /course/Module16_thread/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image03.png -------------------------------------------------------------------------------- /course/Module16_thread/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image04.png -------------------------------------------------------------------------------- /course/Module16_thread/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image05.png -------------------------------------------------------------------------------- /course/Module16_thread/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image06.png -------------------------------------------------------------------------------- /course/Module16_thread/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image07.png -------------------------------------------------------------------------------- /course/Module16_thread/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image08.png -------------------------------------------------------------------------------- /course/Module16_thread/images/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image09.png -------------------------------------------------------------------------------- /course/Module16_thread/images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image10.png -------------------------------------------------------------------------------- /course/Module16_thread/images/image11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image11.gif -------------------------------------------------------------------------------- /course/Module16_thread/images/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image12.png -------------------------------------------------------------------------------- /course/Module16_thread/images/image13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image13.png -------------------------------------------------------------------------------- /course/Module16_thread/images/image14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image14.png -------------------------------------------------------------------------------- /course/Module16_thread/images/image15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-programming_with_java/98e9554e9f7d552fcfdb37a305d0400bff166590/course/Module16_thread/images/image15.png --------------------------------------------------------------------------------